我想將js arguments.callee
替換爲另一個符號,如SELF。匿名遞歸 - 將javascript'arguments.callee'替換爲其他symol如'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組合器。
但是,arguments.callee
不能被這樣的東西替換是否正確? 在的Y Combinator的情況下,代碼必須
var f = function(f) {
return function(n){
return n ? n * f(n - 1) : 1;
}
}
巢變得更深定義階乘,等我不甘心......
EDIT2
很短的時間後,一篇精美的文章點擊。
Anonymous recursion in 6 lines of Javascript
筆者阿恩·馬丁稱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的',我們不不擔心嚴格模式!
您可以使用命名函數表達式並在其中使用該名稱。 – elclanrs
難道你不能只使用'var SELF = arguments.callee;'或者我在這裏丟失了一些東西。 – Shawn31313
只是單挑:使用'arguments.callee'會在嚴格模式下拋出一個'TypeError'。 – founddrama