不推荐使用Arguments.callee - 应该使用什么?

时间:2011-12-02 19:38:48

标签: javascript cross-browser

用于做

之类的事情
setTimeout(function () {
    ...
    setTimeout(arguments.callee, 100);
}, 100);

我需要像arguments.callee这样的东西。我发现information at javascript.info已弃用arguments.callee

  

ECMA-262不推荐使用此属性以支持命名函数   表达式和更好的表现。

但是应该使用什么?这样的东西?

setTimeout(function myhandler() {
    ...
    setTimeout(myhandler, 100);
}, 100);
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace

BTW,arguments.callee跨浏览器兼容吗?

3 个答案:

答案 0 :(得分:10)

是的,理论上,这应该应该使用。你是对的。但是,它在某些版本的Internet Explorer中不能像往常一样工作。所以要小心。您可能需要依靠arguments.callee,或者更简单地说:

function callback() {
    // ...
    setTimeout(callback, 100);
}

setTimeout(callback, 100);

哪种适用于IE。

答案 1 :(得分:5)

  

但是应该使用什么?这样的东西?

是的,你回答了自己的问题。有关详细信息,请参阅此处:

Why was the arguments.callee.caller property deprecated in JavaScript?

对于为何进行此项更改,我们进行了很好的讨论。

答案 2 :(得分:1)

minitech的答案相当不错,但缺少一个场景。你的声明函数叫做回调,这意味着两件事,首先是函数是内存中的对象,第二,函数名只是用于引用对象。如果您出于任何原因打破了这两者之间的引用,那么建议的代码也不会起作用。

证明:

function callback() {
    // ...
    setTimeout(callback, 100);
}

setTimeout(callback, 100);

var callback2 = callback; //another reference to the same object
callback = null; //break the first reference
callback2(); //callback in setTimeout now is null.

说明中的developer Mozilla page是:

  

警告:第5版ECMAScript(ES5)禁止使用   arguments.callee()在严格模式下。避免使用arguments.callee()   要么给函数表达式命名,要么使用函数   函数必须调用自身的声明。

显然这是变通方法的第一个例子" 通过给函数表达式命名",但让我们看看我们如何处理" 或使用函数声明,其中函数必须调用自身"这将带来什么:

function callback(){
   //...
   setTimeout(innercall(), 100);
   function innercall(){
      //innercall is safe to use in callback context
      innercall.caller(); //this will call callback();
   }
}

然后我们可以安全地使用回调引用做任何我们想要的事情:

var callback2 = callback;
callback = null;
callback2(); //will work perfectly.