用于做
之类的事情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
跨浏览器兼容吗?
答案 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.