2013-12-09 53 views
0

我有這樣的對象:的Javascript方面的混亂

var test = { 
setup: function() { property = 'hello!'; console.log(this); } 
}; 

當我運行test.setup();,並打印出test.property();它給了我undefined。我明白這是因爲我需要做this.property,但我的問題是:爲什麼?

我可以清楚地看到上下文是test對象通過console.log(this),但由於某種原因它不起作用。

感謝

+0

此屬性不是一種方法,應該是一個錯誤。 – epascarello

+0

'property'不是測試對象的一部分。它是您分配給'setup'變量的函數的一部分,如果未綁定,則默認爲全局的window.property。 – rdodev

+0

JavaScript不會這樣工作 - 'this'從不*隱式。 – Pointy

回答

2

JavaScript時發現一個鬆散的分配如property = 'hello!',它會創建一個全局變量(或引發錯誤,如果在嚴格模式下)。所以如果你想要它是一個財產,你必須明確。

+0

好吧,但做var test = {你好:'你好!'}沒有這個,但它在這種情況下工作。這只是一個例外嗎? – 0xSina

+1

@ 0xSina這個例子,'var test = {hello:'hi!'}'與原始問題中的代碼完全不同,並且簡單地將一個由對象文字表達式構造的對象引用分配給一個變量。你原來的問題涉及一個函數內的變量名稱(「屬性」)。 – Pointy

0

因爲在這種情況下,property = 'hello!'window.property = 'hello!'相同,而不是this.property = 'hello!'

如果您分配給未聲明的變量,它將創建一個全局變量。

+0

好吧,但做var test = {你好:'嗨!'}沒有這個,但它在這種情況下工作。這只是一個例外嗎? – 0xSina

0

當你用「no var」聲明變量時,你會「不小心」創建全局變量(附加到窗口對象),所以經驗法則:總是在變量聲明中使用「var」。 在這裏使用「var」,你將創建局部變量來設置功能。