2016-03-19 32 views
0

我得到的結果與JavaScript變量重新定義不一樣。我查了一下變量作用域不是孤立的,所以我的問題是,它怎麼能被隔離,以便不會導致與其他代碼的衝突。在javascript中分離範圍

var test = "value"; 
var a = true; 
if(a){ 
    console.log(test); 
    var test = "another"; 
    console.log(test); 
} 
console.log(test); 

大多數人會想到:

value 
another 
value 

但實際:

value 
another 
another 
+0

使用'let'而不是'var'。或者如果您需要支持舊版瀏覽器(舊IE),請使用IIFE。 – nnnnnn

+0

*我擡頭看,變量範圍不是孤立的*你在哪裏看起來? –

+0

爲什麼你需要相同的變量名?只需使用其他名稱。 – Thevs

回答

0

var聲明的變量函數作用域。

如果你想阻止範圍,ES6介紹let

let test = "value"; 
let a = true; 
if(a) { 
    console.log(test); // ReferenceError 
    let test = "another"; 
    console.log(test); // "another" 
} 
console.log(test); // "value" 

let變量仍然懸掛。因此,如果您在創建之前參考(temporal dead zone),您將得到一個ReferenceError而不是父範圍中的值。

+0

好的感謝,雖然從谷歌android safari moble和safari桌面現在不支持。 – InCode

+1

@InCode然後你只有'var',這是函數作用域。考慮將這個塊包裝在一個IIFE中。 – Oriol

1

我擡頭變量範圍並不孤立

你在哪裏看這事呢?每個JS教程和幫助頁面都清楚地表明,使用var聲明的變量具有函數範圍

我對開始JS程序員的表面看起來很迷惑,提出了範圍和提升的問題。正確的方法是:

  1. 聲明你的變量在你所屬函數的頂部。幾乎所有的風格指南,如果你遵循一個,無論如何需要這個。幾乎所有棉絨,如果您使用棉絨,將或可以配置爲強制執行此操作。

  2. 花你計劃用於擔心提升,變量範圍和臨時死亡區的時間,而不是去讀一本書,遛狗,或者實際上做有用的編碼。

  3. 過着漫長而幸福的生活。

如果由於某種原因,你有變量作用域爲塊(任何內部{},如iffor語句體)是很重要的,那麼,使用let。在現實世界中,我認爲你會發現這樣的例子很少,除非你正在編寫包含數十或數百行的巨大函數,這是不好的做法。在這種情況下,再次遵循最佳做法,並在塊的頂部聲明所有變量。

如果您沒有let可用,並且想要在塊內使用另一個同名變量,那麼剛剛使用另一個變量呢?例如,在您給出的示例中,在if區塊內使用test1而不是test。這實際上是巴貝爾在封面下做的。它transpiles

function f() { var x; { let x; } } 

function f() { var x; { var _x; } } 
          ^^ 

你會看到它已改名爲內x_x

你的問題基本上相當於想知道爲什麼當你在你的眼睛裏貼針時疼。不要擔心不同種類的針頭會粘在你的眼睛裏,也不會擔心由此產生的疼痛的生物學機制,爲什麼不停止將針頭粘在眼睛上呢?