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:根本不工作,泄漏到周围的作用域中,并且按照规范工作。调用方
不是好的做法,这里的示例代码实际上似乎没有设置超时。只是不要覆盖声明的函数。