2015-02-09 73 views
2

嘗試理解javascript的基礎知識我遇到以下代碼,並且名爲「foo」的變量的期望值將是7和5,但出現爲7和7.不知道爲什麼。 ...javascript中的全局和局部變量執行上下文

var foo = 5; 
(function Test() { 
    foo = 7; 
    console.log("foo=" + foo); 
})(); 
console.log("foo=" + foo); 

foo=7 
foo=7 
+1

可能重複[JavaScript的變量的範圍是什麼?](http://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript) – ncksllvn 2015-02-09 18:08:59

+0

A真好幻燈片上的範圍和這...你沒有使用這個,但仍然超出範圍很好http://davidql.github.io/scope_talk/#/ – w3bMak3r 2015-02-09 18:10:19

+0

@Someone你建議[this](http:// stackoverflow .com/a/500459/1854575)不會回答他們的問題嗎?真的嗎? – ncksllvn 2015-02-09 18:10:35

回答

3

因爲當你做foo = 7;它使全局變量並將其設置爲7,即使在功能完成它仍然7。你可能希望它是一個局部變量:

(function Test() { 
    var foo = 7; 
    console.log("foo=" + foo); 
})(); 
+0

謝謝。當我閱讀你的回覆時,我立即明白了我誤解的內容。 – DaeYoung 2015-02-09 18:23:31

2

要得到7和5,你需要把「var」放在「foo = 7;」之前。在你的函數中,以防止覆蓋你在函數之外聲明的全局foo。

也就是說,在聲明函數中的變量時,您需要使用var,以使它們在本地作用於該函數。

0

您正在聲明一個全局變量,然後在函數內引用它。如果你想要一個局部變量,使用var關鍵字在你的函數中聲明它。

//foo variable definition here 
var foo = 5; 

(function Test() { 
    //Referencing the already globally defined var. 
    //Use var foo = 7 in order to define a new local var. 
    foo = 7; 
    console.log("foo=" + foo); 
})(); 
console.log("foo=" + foo); 
0

在立即調用的匿名方法中引用全局變量並不意味着它會覆蓋全局範圍中的變量!

foo=7之類的東西只有在沒有其他foo可以從當前範圍訪問時纔會創建一個新變量。在這種情況下存在!

立即調用匿名函數不是一個完全隔離的範圍。作爲一個函數,它有一個局部範圍,在塊外部不可用。但它仍然可以進入全球範圍。