2010-12-04 32 views
28

在javascript中給予這三個構造函數:「無功」 VS「這個」 VS構造函數參數變量

function Foo(data) { 

    var _data = data; 

} 

function Bar(data) { 

    this.data = data; 

} 

function Baz(data) { 

    //just use data freely. 

} 

有什麼區別除了施工後data成員的知名度? (例如,你可以做新的Bar().data但不new Foo().data

回答

25

var _data = data;創建一個本地副本的data(未引用)。 this.data = data實際上創建了對象本身的屬性。

我建議你閱讀這(沒有雙關語意):http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

+2

注意:本地變量分配了參數的值。如果參數是對某個對象的引用,則局部變量也將是對同一對象的引用,而不是對該對象副本的引用。 – Guffa 2014-05-09 09:46:28

+1

這是一個很好的答案(雙關意圖) – Marty 2014-11-27 09:39:09

27

是,不同的是在變量的存儲方式。

var聲明的變量對構造函數是本地的。如果在範圍中聲明瞭任何函數,它將只能在構造函數調用之外生存,因爲它會在函數閉包中捕獲。

this.聲明的變量實際上不是一個變量,而是該對象的一個​​屬性,只要該對象確實存在,它就會存活下來,而不管它是否被使用。

編輯:
如果您在未聲明變量的情況下使用變量,它們將在全局範圍內隱式聲明,而不是對象的一部分。一般來說,您應該嘗試限制您聲明的範圍,以免所有事情都在全球範圍內結束。