1

我正在分析我正在阅读的书中的一些代码,其中有一小部分让我有点困惑:

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

谢谢你的澄清。

4

2 回答 2

1

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

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

于 2012-08-14T19:36:06.277 回答
1

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

另一种方法是创建一个匿名范围,如下所示:

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

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

于 2012-08-14T19:38:26.230 回答