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
)

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

这不太正确。命名函数表达式在其外部不可见。可能存在的重复项