Javascript arguments.callee是否仍然可以安全使用,或者是否有更好的替代方案
我正在分析我正在阅读的一本书中的一些代码,其中有一小段让我有点困惑:Javascript arguments.callee是否仍然可以安全使用,或者是否有更好的替代方案,javascript,Javascript,我正在分析我正在阅读的一本书中的一些代码,其中有一小段让我有点困惑: //... some code setTimeout(function(){ //...some code if(some condition) setTimeout(arguments.callee, 0); }, 0); 让我有点困惑的是,同一本书提到“被调用方”属性已被弃用,除非严格必要,否则不应使用它(我正在解释)。所以我想知道这是否是其中之一,或者是否有更好的方法来完成递归调用。在互联网上
//... some code
setTimeout(function(){
//...some code
if(some condition)
setTimeout(arguments.callee, 0);
}, 0);
让我有点困惑的是,同一本书提到“被调用方”属性已被弃用,除非严格必要,否则不应使用它(我正在解释)。所以我想知道这是否是其中之一,或者是否有更好的方法来完成递归调用。在互联网上的某个地方,我读到以下内容可能会达到同样的效果:
//... some code
setTimeout(function myRecursiveFunction(){
//...some code
if(some condition)
setTimeout(myRecursiveFunction, 0);
}, 0);
这是正确的吗?还有更好的方法吗?继续使用arguments.callee安全吗
感谢您的澄清。
参数。被调用方已弃用,可能会被删除。
这也使得浏览器更难优化代码
您的第二种方法是正确的。
使用名称创建匿名函数(函数表达式)时,函数表达式中的代码可以访问该名称。第二种方法最好。它实际做的是将函数声明“提升”到最近的封闭范围(定义函数)的顶部,并将函数命名为“myRecursiveFunction”
另一种方法是创建一个匿名作用域,如下所示:
setTimeout(
(function(){
var myRecursiveFunction = function() {
console.log(myRecursiveFunction);
};
return myRecursiveFunction
}),
1000
)
或者使用函数式编程中的定点组合器。这不太正确。命名函数表达式在其外部不可见。可能存在的重复项