我想将 js 替换arguments.callee
为另一个符号,例如SELF。
可能吗?
像sweetjs这样的宏方法是唯一的方法吗?
编辑
非常感谢您的投入:
我了解arguments.callee
在 StrictMode 中是禁止的。
为了清楚起见,我展示了我的代码:匿名递归
var factorial = function (n)
{
return n ? n * arguments.callee(n - 1) : 1;
};
console.log( factorial(10) ); //3628800
现在
var SELF = function (val)
{
return arguments.callee(val);
}
var factorial = function (n)
{
return n ? n * SELF(n - 1) : 1;
};
console.log( factorial(10) );
给出错误
var SELF = function (val)
^
RangeError: Maximum call stack size exceeded
另外,我知道匿名递归有一种方法不使用arguments.callee
,而是使用Y-Combinator。
但是,arguments.callee
不能用这样的东西代替吗?在Y-Combinator Scenario 中,代码必须是
var f = function(f) {
return function(n){
return n ? n * f(n - 1) : 1;
}
}
巢变得更深以定义我不愿意的阶乘等...
编辑2
不一会儿,一篇好文章就来了。
作者 Arne Martin 称z-combinator 为:
var Z = function(func)
{
var f = function ()
{
return func.apply(null, [f].concat([].slice.apply(arguments)));
};
return f;
}
var factorial = function (f, n)
{
return n ? n * f(n - 1) : 1;
}
console.log( Z(factorial)(10) );
这种方法完美地满足了我的需求,而且由于它不需要'arguments.callee',我们不用担心严格模式!