2013-01-02 212 views
6

我遇到的JavaScript一個奇怪的範圍問題(見JSFiddle):的Javascript全局變量範圍問題

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    var someGlobal = 5; 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Displays 3, why? 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

爲什麼不使用Javascript拋出一個不確定的問題someF2()someF2()怎麼可以訪問someGlobalsomeF()不是?我怎樣才能確保一個全局變量可以在函數中訪問?

備註:

在這兩種情況下,該功能啓動通過調用alert(someglobal),爲什麼一個函數拋出一個不確定的問題,其他的呢?

回答

7

someF創建一個名爲someGlobal(掩蓋全局someGlobal)的新變量(本地作用域)併爲其分配一個值。它不會觸及全局someGlobal(儘管由於在範圍中有另一個具有相同名稱的變量,因此無法訪問它)。

var報表懸掛,所以someGlobal被屏蔽的someF所有(不僅僅是var語句後)。直到爲其分配值爲止,本地someGlobal的值爲undefined

someF2訪問原始(未觸動的)全局someGlobal

+0

+1爲最佳答案,但更多地描述全局變量被函數中的局部變量覆蓋:D –

+0

它不會被覆蓋,它會被屏蔽。 – Quentin

+0

好吧,你可以給我一點關於兩者的解釋!我還沒有對它做過研究!只有那個函數會被覆蓋或不被覆蓋? –

4

由於您聲明瞭一個具有相同名稱的局部變量。所以它將該值賦給局部變量。在someF()中從var someGlobal中刪除var並且它應該沒問題。

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    someGlobal = 5; // <-- orignially var someGlobal = 5 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Should display 5 now 
    alert(someGlobal); 
} 

someF(); 
someF2(); 
1

someF2顯示3,因爲它仍然是

在someF()創建恰好具有相同的名稱作爲someGlobal一個新的變量。這對最初的someGlobal沒有任何作用,它只是創建一個新的變量本地來運行someF,該函數在該函數結束時消失。

所以,你有局部變量(例如在var中創建的someF)和全局變量。

+0

好的,但是爲什麼我在一種情況下得到一個不確定的問題,而不是其他?這是我的問題。 – JVerstry

+0

我想昆汀現在已經解釋過了。 –

-1

以下是如何使用thissomeF內使用本地和全局變量的示例。

var someGlobal = 3; 

function someF() { 

    // Displays 3 
    alert(someGlobal); 
    this.someGlobal = 5; 
    someGlobal = 5; 
    // Displays 5 
    alert(this.someGlobal); 
} 

function someF2() { 
    // Displays 5 
    alert(someGlobal); 
} 

someF(); 
someF2();