arguments.callee仍然可以安全使用,还是有更好的选择

时间:2012-08-14 19:33:18

标签: javascript

我正在分析我正在阅读的一本书中的一些代码,并且有一小部分让我感到困惑:

//... 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是否安全可行?

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:1)

arguments.callee已被弃用,可能会被删除 它还使浏览器难以优化代码。

你的第二种方法是正确的 当您使用名称创建匿名函数(函数表达式)时,该函数表达式中的代码可以访问该名称。

答案 1 :(得分:1)

第二种方法是最好的。它实际上做的是将函数声明“提升”到最近的封闭范围(定义它的函数)的顶部,并将函数命名为“myRecursiveFunction”。

替代方案是创建一个匿名范围,如下所示:

setTimeout(
    (function(){
        var myRecursiveFunction = function() {
            console.log(myRecursiveFunction);
        };
        return myRecursiveFunction
    }),
    1000
)

或者可能使用函数式编程中的定点组合器。