我正在分析我正在阅读的一本书中的一些代码,并且有一小部分让我感到困惑:
//... 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是否安全可行?
感谢您的任何澄清。
答案 0 :(得分:1)
arguments.callee
已被弃用,可能会被删除
它还使浏览器难以优化代码。
你的第二种方法是正确的 当您使用名称创建匿名函数(函数表达式)时,该函数表达式中的代码可以访问该名称。
答案 1 :(得分:1)
第二种方法是最好的。它实际上做的是将函数声明“提升”到最近的封闭范围(定义它的函数)的顶部,并将函数命名为“myRecursiveFunction”。
替代方案是创建一个匿名范围,如下所示:
setTimeout(
(function(){
var myRecursiveFunction = function() {
console.log(myRecursiveFunction);
};
return myRecursiveFunction
}),
1000
)
或者可能使用函数式编程中的定点组合器。