2013-07-19 45 views
0

我想在我的js中創建一個靜態變量。從我知道的我的小js知識是,我可以用這兩種方法做到這一點。這與javascript中的函數屬性

function foo(){ 

    if (this.counter==undefined){this.counter=1} 
    else {this.counter++ } ; 

} 

function foo(){ 

    if (foo.counter==undefined){foo.counter=1} 
    else {foo.counter++ } ; 

} 

這兩件事情基本相同,或者我需要小心選擇一個與其他。

我的另一個問題是:爲什麼這樣做時不需要var?

+0

你需要閱讀有關** **範圍 – acudars

+0

我不知道在JavaScript的執行線索,但通常一個建築像'FOO .counter'使變量'counter'可以從任何'foo'對象中獲得。 (例如'var a = new Foo(); var b = new Foo(); a.counter === b.counter;'。我不確定這是否也適用於JavaScript。 – Sumurai8

+0

您是否打算使用'foo'使用'new'創建對象,或者只是把它作爲一個函數調用而不用'new'? –

回答

2

不,它們不相同。在你的第一個例子中,你正在使用this。根據函數的調用方式,this實際上可以改變。

function showThis(){ 
    console.log(this); 
} 

var obj = { }; 
obj.showThis = showThis; 

showThis(); // gives 'window', or the top-most scope of your page 
obj.showThis(); // gives obj as 'this' 

如果你總是調用該函數以同樣的方式,那麼這將僅僅意味着價值counter跟蹤作爲window.counter的屬性。這很糟糕,因爲您可能會意外地在該範圍內有一個名爲counter的實際變量,您現在正在其他地方以不同的方式使用該變量。如果你不是每次都以相同的方式調用它,那麼this將會不同,可能不會給你所需的行爲。

如果您試圖保持被調用次數foo的數量,而不管其調用方式如何,那麼您的第二種方法更合適。對於代碼的緣故澄清/慣例,我會這樣寫:

function foo(){ 
    // If counter does not exist, create it and initialize it to 0. 
    foo.counter = foo.counter || 0; 
    foo.counter++; 
} 

foo.counter; // undefined, since foo has never been called yet 
foo(); 
foo.counter; // is now 1 
+0

這絕對說明了我想了解的內容。謝謝馬特。 –

+0

@Jack_of_All_Trades很高興幫助! – Matt

1

var用於在當前範圍內創建變量。

您正在使用的兩種方法都是在一個存在於更大範圍內的對象上設置屬性。

+0

你能否澄清一下,如果我有var this.counter = 1而不是this.counter = 1,會發生什麼?案件? –

+1

你會得到一個異常。 'var'用於聲明變量,而不是對象的屬性。 – Quentin