我正在尝试创建一个递归匿名函数。
这是功能:
(function (i) {
console.log(i);
if (i < 5) this(i + 1)
})(0)
我知道“这个”是窗口对象。有办法调用函数吗?
答案 0 :(得分:12)
可以使用arguments.callee
属性。
(function(i){console.log(i);if(i<5)arguments.callee(i+1)})(0)
实现相同功能的另一种方法是命名功能。在范围之外,名称将不可用:
(function tmp(i){console.log(i);if(i<5)tmp(i+1)})(0); //OK, runs well
alert(typeof tmp); // Undefined
<小时/> 请注意,在严格模式下禁止使用
arguments.callee
属性:
"use strict";
(function(){arguments.callee})();
投掷:
TypeError:严格模式函数或调用它们的参数对象可能无法访问'caller','callee'和'arguments'属性
答案 1 :(得分:1)
啊...递归的函数形式.... [[[flash to comp sci class]]]
您可以使用辅助功能:
function X(f) { return f.apply(this, arguments); }
X(function(me, n) { return n<=1 ? n : n*me(me,n-1); }, 6);
(返回720;这是阶乘函数,递归的典型示例)
这可能会被匿名化:
(function (f) { return f.apply(this, arguments); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
或专门针对一个参数的函数,以避免apply
和arguments
:
(function (f,x) { return f(f,x); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
(两者都返回720)
使用辅助函数的这个技巧允许你的函数接收自己作为它的第一个参数,从而调用它自己。
调整你的例子:
(function (f,x) { return f(f,x); })(
function(me, i) { console.log(i); if (i<5) me(me,i+1); },
0)
在Firebug中按预期工作(将0,1,2,3,4,5记录到控制台)
答案 2 :(得分:1)
你给匿名函数命名,这里我给它起一个名字“_”,虽然它被命名,但它仍然是匿名的。
(function _( i ) {
console.log(i);
if (i < 5){ _(i + 1); }
})(0);