2011-01-12 63 views
0

可能重複:
Javascript scoping variables theory這是什麼意思?引擎錯誤還是什麼?

大家好,

我想問東西的陌生人。這是代碼。

 
var a = "defined"; 
function f() { 
    alert(a); 
    var a = 5; 
} 
f(); 

警報 「未定義」

任何人都可以解釋,爲什麼我收到 「未定義」。

法提赫..

+1

基本上精確重複的[Javascript範圍變量理論](http://stackoverflow.com/questions/4405749/javascript-scoping-variables-theory) – deceze 2011-01-12 08:56:13

回答

2

這就是所謂的的JavaScript起重我想。看看這個視頻,瞭解更多關於它和解決它:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

要使其工作,你將不得不刪除var關鍵字表單變量a:所以基本上

var a = "defined"; 
function f() { 
    alert(a); 
    a = 5; 
} 
f(); 

,這是一個可變範圍問題。刪除var關鍵字的行爲使全局變量可用。因此,這次沒有提出任何錯誤。

+0

但是,刪除`var`也可能不會做你想做的事情,因爲現在你正在搞亂全局變量。 (儘管如此,這並不令人驚訝)。 – Thilo 2011-01-12 09:01:57

0

在函數中,你得到一個新的範圍。

該函數中的var a聲明瞭一個局部變量a,它掩蓋了全局變量。

a的分配發生在稍後(在警報之後),因此在此之前a未定義。

令人困惑的部分是,如果您在函數的頂部或其他地方聲明瞭var a(甚至可以在if中),則無關緊要。效果是一樣的:它爲該範圍聲明瞭一個變量(即使對於聲明之前的代碼也是有效的)。這就是爲什麼jslint建議在上面聲明所有局部變量。