Javascript Arguments.callee已弃用-应使用什么替代?

Javascript Arguments.callee已弃用-应使用什么替代?,javascript,cross-browser,Javascript,Cross Browser,因为做了这样的事情 setTimeout(function () { ... setTimeout(arguments.callee, 100); }, 100); 我需要类似于arguments.callee的东西。我发现参数.callee已被弃用: ECMA-262反对使用该属性,而赞成使用命名函数 表达式和,以获得更好的性能 那么应该用什么来代替呢?像这样的东西 setTimeout(function myhandler() { ... setTimeou

因为做了这样的事情

setTimeout(function () {
    ...
    setTimeout(arguments.callee, 100);
}, 100);
我需要类似于
arguments.callee的东西。我发现
参数.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
顺便问一下,
arguments.callee是否兼容跨浏览器

那么应该用什么来代替呢?像这样的东西

setTimeout(function myhandler() {
    ...
    setTimeout(myhandler, 100);
}, 100);
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace
是的,你回答了你自己的问题。有关更多信息,请参见此处:


这篇文章对为什么要做出这样的改变进行了很好的讨论。

是的,理论上应该这样做。你说得对。但是,它在某些版本的InternetExplorer中无法正常工作。所以要小心。您可能需要求助于
参数。被调用方
,或者更确切地说,一个简单的:

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

setTimeout(callback, 100);

这在IE上确实有效。

minitech的答案很好,但它缺少一个场景。您的声明函数称为callback,这意味着两件事,第一,函数是内存中的对象,第二,函数名仅用于引用对象。如果您出于任何原因中断了这两者之间的引用,那么建议的代码也不会起作用

证明:

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.
从描述中可以看出:

警告:第5版ECMAScript(ES5)禁止使用 参数。被调用方()处于严格模式。避免通过以下方式使用参数.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.

值得一提的是:。是的,您应该命名您的函数并在setTimeout中使用它的名称。可能重复@cHao,不,这不是重复的:arguments.callee.caller deprevation并不意味着对整个arguments.callee的deprevation。此外,这个问题不会问“应该用什么来代替!”@Tomas:检查答案。你问的每件事都在他们里面提到了。等等-你想说
setTimeout(函数myhandler(){setTimeout(myhandler…
)在某些版本的IE中不起作用?这是一件非标准的事情吗?我认为这是一件非常标准的事情。@TomasT:这是标准的-但是从什么时候起IE就完全标准了?:)(嗯,也许是IE10。)我记得有一段时间被它绊倒了。快速测试表明,它至少在IE7中不是问题。可能是IE6。我没有带它去测试。据Microsoft称,它在IE6中工作:@lolzerywowzery:这是
参数。被调用方
,不是命名函数表达式。IE中有三段命名函数表达式,IIRC:根本不工作,泄漏到周围的作用域中,并且按照规范工作。
调用方
不是好的做法,这里的示例代码实际上似乎没有设置超时。只是不要覆盖声明的函数。