我想替换jsarguments.callee
到另一个符号,例如SELF.
是否可以?
宏观方法如sweetjs http://sweetjs.org/是唯一的办法吗?
EDIT
非常感谢您的投入:
我明白arguments.callee
在严格模式下是被禁止的。
为了清楚起见,我展示我的代码:匿名递归
var factorial = function (n)
{
return n ? n * arguments.callee(n - 1) : 1;
};
console.log( factorial(10) ); //3628800
and now
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-组合器.
But, arguments.callee
不能用这样的东西代替吗?
在Y-组合器场景,代码必须是
var f = function(f) {
return function(n){
return n ? n * f(n - 1) : 1;
}
}
嵌套变得更深来定义阶乘等,我不愿意......
EDIT2
没过多久,一篇好文章就出现了。
6行Javascript的匿名递归 http://am.aurlien.net/post/2810658101/z-combinator
作者阿恩·马丁 (Arne Martin) 称z-组合器:
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”,所以我们不用担心严格模式!