如何使这个JavaScript工作?

Mar*_*ine 5 javascript anonymous this

我正在尝试制作一个递归的匿名函数.

这是功能:

(function (i) {
    console.log(i);
    if (i < 5) this(i + 1)
})(0)
Run Code Online (Sandbox Code Playgroud)

我知道"这个"是窗口对象.有没有办法调用该功能?

Rob*_*b W 12

该arguments.callee物业可以使用.

(function(i){console.log(i);if(i<5)arguments.callee(i+1)})(0)
Run Code Online (Sandbox Code Playgroud)

实现相同功能的另一种方法是命名功能.在范围之外,名称将不可用:

(function tmp(i){console.log(i);if(i<5)tmp(i+1)})(0); //OK, runs well
alert(typeof tmp); // Undefined
Run Code Online (Sandbox Code Playgroud)


请注意,arguments.callee在严格模式下禁止使用该属性:

"use strict";
(function(){arguments.callee})();
Run Code Online (Sandbox Code Playgroud)

抛出:

TypeError:严格模式函数或调用它们的参数对象可能无法访问'caller','callee'和'arguments'属性

  • 请注意,`arguments.callee`已被弃用(如果你曾经在JavaScript会议上听到过这种声明,那就非常大声),将来也不会支持.它也很慢.此外,在使用函数*表达式*(而不是声明语句)定义函数时命名函数是有风险的,因为[浏览器有时会做奇怪的事情.](http://kangax.github.com/nfe/) (4认同)