js をSELFarguments.callee
のような別のシンボルに置き換えたい。
出来ますか?
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
また、匿名再帰で を使用せずにY-Combinatorarguments.callee
を使用する方法があることも知っています。
でも、arguments.callee
そんなものに置き換えられないよね?Y コンビネーターシナリオでは、コードは
var f = function(f) {
return function(n){
return n ? n * f(n - 1) : 1;
}
}
私が望んでいない階乗などを定義するために、巣はより深くなります...
EDIT2
しばらくすると、良品が当たります。
著者の 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」を必要としないため、strict モードについて心配する必要もありません。