大家好,
我想問東西的陌生人。這是代碼。
var a = "defined"; function f() { alert(a); var a = 5; } f();
警報 「未定義」
任何人都可以解釋,爲什麼我收到 「未定義」。
法提赫..
大家好,
我想問東西的陌生人。這是代碼。
var a = "defined"; function f() { alert(a); var a = 5; } f();
警報 「未定義」
任何人都可以解釋,爲什麼我收到 「未定義」。
法提赫..
這就是所謂的的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
關鍵字的行爲使全局變量可用。因此,這次沒有提出任何錯誤。
但是,刪除`var`也可能不會做你想做的事情,因爲現在你正在搞亂全局變量。 (儘管如此,這並不令人驚訝)。 – Thilo 2011-01-12 09:01:57
在函數中,你得到一個新的範圍。
該函數中的var a
聲明瞭一個局部變量a
,它掩蓋了全局變量。
對a
的分配發生在稍後(在警報之後),因此在此之前a
未定義。
令人困惑的部分是,如果您在函數的頂部或其他地方聲明瞭var a
(甚至可以在if中),則無關緊要。效果是一樣的:它爲該範圍聲明瞭一個變量(即使對於聲明之前的代碼也是有效的)。這就是爲什麼jslint建議在上面聲明所有局部變量。
基本上精確重複的[Javascript範圍變量理論](http://stackoverflow.com/questions/4405749/javascript-scoping-variables-theory) – deceze 2011-01-12 08:56:13