2013-05-16 77 views
1

我遇到了 - 看起來有點奇怪的問題。比方說,我有一個JavaScript對象像這樣的:在JavaScript中引用一個帶有數值的對象屬性

var Object = { 
    Property1: 0, 
    Property2: 1, 
    TxtProperty: "Sample text", 

    Update: function() { 
     this.Property1++;      // Doesn't work 
     Object.Property2++;     // Does work 
     this.TxtProperty = "Hello world";  // Does work 

     $('#prop-1').text(this.Property1);  // Prints NaN 
     $('#prop-2').text(Object.Property2); // Prints correct value 
     $('#txt-prop').text(this.TxtProperty); // Prints correct value 
    } 
}; 

See this fiddle了演示。點擊「開始」以啓動計時器並更新值。正如你所看到的,使用parseInt也沒有幫助。

我已經在Firefox,Chrome和IE10中測試過了。他們都表現出相同的行爲。

爲什麼不能使用this從具有函數值的另一個屬性中引用具有數值的屬性?爲什麼它可以與非數字值一起工作?這是一個錯誤還是這是打算?

這不是一個真正的問題,因爲我們可以簡單地使用父對象的名稱來更新數值,但我只是很好奇爲什麼這樣。

+0

我覺得'this'會參考Window的使用方式。不是父對象。 –

+0

但是當然'this.TxtProperty'也不應該。 – Knelis

+1

它工作是因爲它創建了一個新的'window.TxtProperty'屬性。 – Barmar

回答

2

setTimeoutwindow上下文中運行函數,所以其中的this指的是window。如果您bind適當this範圍內,那麼它會很好地工作:

interval = setInterval(Object.Update.bind(Object), 1000); 
            -----^------ 

演示:http://jsfiddle.net/wC2uM/2/

bind只有這樣,如果你需要支持舊的IE瀏覽器可以使用匿名函數工作在現代瀏覽器:

interval = setInterval(function(){ Object.Update(); }, 1000); 

請記住,在JavaScript中this取決於你如何調用函數;它是可變的。

+1

您可以將Object.Update.call(Object);簡化爲Object.Update();';) –

相關問題