2012-07-09 79 views
7

對於這個片段困惑,我並不感到驚訝全局變量「A」的計算結果爲5。這個JavaScript代碼段

http://jsfiddle.net/MeiJsVa23/gZSxY/

var a = 10; 

function func(){ 
    a = 5; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // and this prints out 5 as expected. No surprise here. 
​ 

但是,如何來爲這個代碼片斷,全球變量'a'的計算結果是10而不是5?就好像a = 5從未發生過。

http://jsfiddle.net/MeiJsVa23/2WZ7w/

var a = 10; 

function func(){ 
    a = 5; 
    var a = 23; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // but this prints out 10!! why? 

+0

哇,我認爲你的問題已經得到解答;) – mplungjan 2012-07-09 14:37:30

回答

0

該函數中的var a被提升到函數作用域的頂部,所以它是局部變量被修改的,而不是全局變量。

0

這與吊裝

函數中聲明瞭一個名稱相同的局部變量。即使它發生在你修改之後,它也被認爲是在它之前被宣佈 - 這被稱爲提升。

局部變量提示聲明但不值。所以:

function someFunc() { 
    alert(localVar); //undefined 
    var localVar = 5; 
} 

功能,如果與function name() {...語法,葫蘆兩種申報和值聲明。

function someFunc() { 
    alert(someInnerFunc()); //5 
    function someInnerFunc() { return 5; } 
} 
0
var a = 10; //a is 10 

function func(){ 
    a = 5; //a is 5 
    var a = 23; // a is now in local scope (via hoisting) and is 23 
} 

func(); 

alert(a); // prints global a = 10 
1

這就是所謂的 「variable hoisting」。 var聲明(和function()聲明)將移至其範圍的頂部。

0

假設語句var a = 23爲整個範圍創建了一個局部變量。因此,全球a對整個func()都有影響,不僅僅針對聲明下面的句子。因此,在第二個片段中,a = 5正在分配給下面聲明的局部變量。

2

所以,這裏有兩件事:hoistingshadowing

因爲第一個,變量聲明「懸掛」在上面,因此你的代碼就相當於:

var a = 10; 

function func(){ 
    var a; 
    a = 5; 
    a = 23; 
} 

而且,因爲第二個,你在「陰影」的全局變量a與一個本地的,所以這些變化不會反映到全球a

+0

+1爲例,並且很煩惱地解釋什麼是起重的意思。 – 2012-07-09 15:10:43