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

Is arguments.callee still safe to use or is there a better alternative

本文关键字:是否 或者是 或者 更好 选择 callee 安全 arguments      更新时间:2023-09-26

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

//... some code
setTimeout(function(){
   //...some code
   if(some condition)
      setTimeout(arguments.callee, 0);
}, 0);

让我有点困惑的是,同一本书提到"callee"属性已被弃用,除非绝对必要,否则不应使用它(我正在解释)。所以我想知道这是否是其中一种情况,或者是否有更好的方法来完成递归调用。我在互联网上的某个地方读到以下内容可能会完成同样的事情:

//... 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
)

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

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

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