2011-07-31 44 views
32

this教程中有記載:重新聲明JavaScript變量

If you redeclare a JavaScript variable, it will not lose its value.

爲什麼我要重新聲明一個變量?在某些情況下是否實用?

謝謝

+12

http://w3fools.com/ – Quentin

回答

41

這無非就是一個提醒,如果你這樣做:

var x=5; 
var x; 
alert(x); 

結果將是5

如果你在其他一些語言重新聲明變量例如 - 結果將是未定義的,或NaN,但不是在JavaScript中。

+0

有趣。當我嘗試重新聲明一個類時,我得到同樣的錯誤。我有一個帶有通用說話功能的Animal類,看起來像'console.log(this.name +'發出聲音。')'。當然,在我宣佈它之後,我意識到'make'在引號和單詞之間需要一個空格。所以我導航到入口,相應地修正它,並重新提交,認爲新的聲明會覆蓋以前的聲明。顯然,這不是JavaScript的工作原理。那麼我該如何處理這個問題呢? – Musixauce3000

18

爲什麼要重新聲明變量?

您不應該。它使代碼混淆。

它在某些情況下是否實用?

+0

你的回答非常好,但我只能選擇一個接受。 – xralf

+0

這更像是無意或無意地重新聲明變量。 – Adnan

+2

如果我在一個函數中有兩個沒有嵌套的循環,並且聲明的'var i = 0'僅在循環中使用,那麼爲什麼我應該爲第二個循環創建另一個名稱?所以這是至少一個例子,其中可變重新聲明是實用的,我認爲 – user907860

7

在javascript中沒有塊範圍,從而可取的是重新聲明的變量爲清楚的目的;這使得更好的代碼。

例如:

for (var x=0; x< 100; x++) { } 

alert(x); //In most languages, x would be out of scope here. 
      //In javascript, x is still in scope. 


//redeclaring a variable helps with clarification: 
var x = "hello"; 
alert(x); 
30

重新聲明一個變量的一個例子可以在Google Analytics找到。當JavaScript跟蹤代碼是由谷歌Analytics(分析)腳本開始,它聲明或以這種方式redeclares _gaq

var _gaq = _gaq || []; 

換句話說,如果_gaq已經定義,_gaq是「重新聲明」的本身。如果沒有定義,它將首次被聲明爲空數組。

這允許Google Analytics(分析)跟蹤代碼支持在啓動Google Analytics代碼之前可能需要使用該變量的其他腳本。正如@xralf指出的那樣,JavaScript允許這樣做。

如果變量已被定義,重新標識變量很有用。

通過像Google Analytics(分析)跟蹤代碼那樣有條件地重新聲明變量,它允許變量安全地從多個位置發起。

在這個例子中,使用_gaq變量的其他代碼也可以安全地檢查預定義的_gaq變量。如果存在,它知道它可以使用它。如果它不存在,它知道它應該在嘗試使用它之前定義它。

+0

非常好的答案,+1,特別是關於允許a變量「可以安全地從多個地方發起」。當你將JS塊重構爲單獨的文件並希望能夠根據需要使用小塊和塊時,它有助於完成你在'_gaq'示例中提到的內容(可怕的變量名稱,不過,不是嗎? ?)。 –

0

一般來說,由於吊裝問題(see here),在其他語句後面分配var可以認爲是不好的風格。使用「單變量模式」(see here),重新聲明只能發生在Steve Oliver的Google Analtyics示例中。我重構上面的例子:

var x, max = 100; // no further var declarations afterwards! 

for (x = 0; x < max; x++) { } 

alert(x); 

// redeclaration 'var x = "hello"' doesn't make any sense here 
// and would be complained about by JSLint/-Hint 
x = 'hello'; 
alert(x); 

一個重聲明可以使用默認值然而,當可選參數的意義(這是谷歌分析的例子是什麼,我認爲):

function abc(param1) { 
    var param1 = param1 || 'default value'; 
} 
2

它不會失去它的價值,因爲Hoisting

var x = 5; 
var x; 

// this is same as 

var x; // undefined; 
x = 5; 

所以,當你說:「如果你一個重新聲明的javascrip t變量,它不會失去它的價值。「

根據提升,聲明全部移到頂端。 然後變量被賦值。

var x = 25; 
var x; // redeclare first time 
var x; // redeclare second time 

// is same as 

var x; // undefined 
var x; // Not sure if this happens, but doesn't make a difference, it's still undefined 
x = 25; 

至於實用性,有時會發生。看@steveoliver的答案。