Arguments.callee已弃用 - 应该使用什么?

问题描述:

对于做这样的事情Arguments.callee已弃用 - 应该使用什么?

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

我需要这样的东西arguments.callee。我发现information at javascript.infoarguments.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跨浏览器兼容?

+2

对于WH值得:[命名函数表达式揭秘](http://kangax.github.com/nfe/)。 – sdleihssirhc

+0

是的,你应该命名你的函数并在setTimeout中使用它的名字。 – kubetz

+1

[为什么在JavaScript中不推荐使用arguments.callee.caller属性?](http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao

是的,这就是理论上应该使用。你是对的。但是,它一直在某些版本的Internet Explorer中不起作用。所以要小心。您可能需要依傍arguments.callee,或者说,一个简单的:

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

setTimeout(callback, 100); 

这确实在IE工作。

+1

等待 - 你想说'setTimeout(function myhandler(){setTimeout(myhandler ...'在某些版本的IE中不起作用吗?这是非标准的东西吗?我认为这是一个非常标准的事情 – TMS

+3

@TomasT .:它*是*标准 - 但自从什么时候IE浏览器完全标准化了以后?:)(好吧,也许IE10)。我记得有一段时间被绊倒了。快速测试表明这不是问题在IE7中至少可能IE6,我没有与我一起测试 – Ryan

+0

据微软称,它在IE6中工作:https://docs.microsoft.com/en-us/scripting/javascript/reference/callee -property-arguments-javascript –

但是应该用什么来代替?这样的事情?

是的,你回答了你自己的问题。欲了解更多信息,请参见这里:

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

它为什么这个改动是相当不错的讨论。

+0

谢谢乔纳森。 – TMS

minitech答案是相当不错的,但它缺少一个更多的场景。您的declare函数称为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. 

从描述developer Mozilla page是:

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

'呼叫者'是不好的做法,这里的示例代码实际上并没有设置超时。只是不要覆盖你的声明函数。 – Ryan