Arguments.callee已弃用 - 应该使用什么?
对于做这样的事情Arguments.callee已弃用 - 应该使用什么?
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
顺便说一句,是arguments.callee
跨浏览器兼容?
是的,这就是理论上应该使用。你是对的。但是,它一直在某些版本的Internet Explorer中不起作用。所以要小心。您可能需要依傍arguments.callee
,或者说,一个简单的:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
这确实在IE工作。
等待 - 你想说'setTimeout(function myhandler(){setTimeout(myhandler ...'在某些版本的IE中不起作用吗?这是非标准的东西吗?我认为这是一个非常标准的事情 – TMS
@TomasT .:它*是*标准 - 但自从什么时候IE浏览器完全标准化了以后?:)(好吧,也许IE10)。我记得有一段时间被绊倒了。快速测试表明这不是问题在IE7中至少可能IE6,我没有与我一起测试 – Ryan
据微软称,它在IE6中工作:https://docs.microsoft.com/en-us/scripting/javascript/reference/callee -property-arguments-javascript –
但是应该用什么来代替?这样的事情?
是的,你回答了你自己的问题。欲了解更多信息,请参见这里:
Why was the arguments.callee.caller property deprecated in JavaScript?
它为什么这个改动是相当不错的讨论。
谢谢乔纳森。 – 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.
警告: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.
'呼叫者'是不好的做法,这里的示例代码实际上并没有设置超时。只是不要覆盖你的声明函数。 – Ryan
对于WH值得:[命名函数表达式揭秘](http://kangax.github.com/nfe/)。 – sdleihssirhc
是的,你应该命名你的函数并在setTimeout中使用它的名字。 – kubetz
[为什么在JavaScript中不推荐使用arguments.callee.caller属性?](http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao