2012-01-25 21 views
5

是否可以從對象文字中遞歸調用方法?JavaScript對象文字方法:遞歸調用

例如:

(function() { 
    'use strict'; 
    var abc = ['A', 'B', 'C'], 
     obj = { 
      f: function() { 
       if (abc.length) { 
        abc.shift(); 
        f(); // Recursive call 
       } 
      } 
     }; 

    obj.f(); 
}()); 

錯誤:它被定義之前使用 'F'。

謝謝。

回答

1

在代碼的任何位置都沒有定義變量f。使用obj.f()(或this.f,如果您知道this指向它應該在的位置)。

3

f是您的對象上的方法。因此,當您處於f時,this將是f附加到的對象。因此,要遞歸調用f,使用this.f()

f: function() { 
    if (abc.length) { 
     abc.shift(); 
     this.f(); // Recursive call 
    } 
} 

只要注意的f裏面,this只會是當前對象,如果f被調用的方法:obj.f();

如果somethinig喜歡:obj.f.call(lala);,然後this現在將是lala。如果你這樣做:

var func = obj.f; 
func(); 

現在thisf內的全局對象(或不確定的嚴格模式)

+0

'this'可能或可能不指向'obj',這取決於'f'的方式, 叫做。在稍後咬人之前,最好弄清楚。 –

+0

@MattiVirkkunen - 確實已編輯。感謝您的提示,並享受您的新徽章:) –

+0

耶[!](http://stackoverflow.com/questions/9006587/javascript-object-literal-method-recursive-call) –

10

您可以通過使用命名函數表達式

 f: function myself() { 
      if (abc.length) { 
       abc.shift(); 
       myself(); // Recursive call 
      } 
     } 

必須閱讀:http://kangax.github.com/nfe/

+1

這應該是選擇的答案。感謝您的鏈接了。 – kliron

+0

究竟是什麼使它成爲一個命名函數能夠避免這個錯誤?創建它自己的閉包? –