繁体   English   中英

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

[英]Arguments.callee is deprecated - what should be used instead?

做的事情

setTimeout(function () {
    ...
    setTimeout(arguments.callee, 100);
}, 100);

我需要像arguments.callee这样的东西。 在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跨浏览器兼容吗?

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

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

setTimeout(callback, 100);

哪个适用于IE。

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

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

为什么在JavaScript中不推荐使用arguments.callee.caller属性?

关于为什么要做出这种改变,它有一个非常好的讨论。

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.

来自开发人员Mozilla页面的描述是:

警告:第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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM