2012-08-14 22 views
1

我分析从一本书我读了一些代码并存在混淆了我一点点的一小片:是arguments.callee的还是安全使用或是否有更好的选择

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

[Arguments.callee已弃用 - 应该用什么来代替?](http://stackoverflow.com/questions/8361642/arguments-callee-is-deprecated-what-should-be-used-instead ) – DavidRR 2015-06-18 19:26:16

回答

1

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

另一种选择将被创建匿名范围如下所示:

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

或可能使用从功能编程一个定点组合子。

+0

这并不完全正确。命名的函数表达式在其自身之外是不可见的。 – SLaks 2012-08-14 19:47:09

1

arguments.callee已弃用,可能移除。
它也使浏览器难以优化代码。

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

相关问题