2012-08-14 48 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已棄用,可能移除。
它也使瀏覽器難以優化代碼。

你的第二種方法是正確的。
使用名稱創建匿名函數(函數表達式)時,函數表達式中的代碼可以訪問該名稱。

相關問題