[英]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.