我有這樣一段代碼變量和函數範圍在javascript
var a = 5;
function woot(){
console.log(a);
var a = 6;
function test(){ console.log(a);}
test();
};
woot();
我期待5和6作爲輸出,但我有不確定和6代替。
有什麼想法?
我有這樣一段代碼變量和函數範圍在javascript
var a = 5;
function woot(){
console.log(a);
var a = 6;
function test(){ console.log(a);}
test();
};
woot();
我期待5和6作爲輸出,但我有不確定和6代替。
有什麼想法?
變量聲明懸掛在它們出現的範圍的頂部。你的代碼是這樣解釋:
var a; // Outer scope, currently undefined
a = 5; // Outer scope, set to 5
function woot(){ // Function declaration, introduces a new scope
var a; // Inner scope, currently undefined
console.log(a); // Refers to inner scope 'a'
a = 6; // Inner scope, set to 6
function test(){ console.log(a);} // Refers to inner scope 'a' (now 6)
test();
};
woot();
在聲明函數內部的變量,這個變量將影子與已在祖先的範圍被宣佈爲相同標識符的任何變量。在你的例子中,你在全局範圍內聲明a
。然後您在woot
函數的範圍內聲明具有相同標識符的另一個變量。這個變量會影響你在全局範圍內聲明的a
。
我無法理解這個區別,以及懸掛的含義是什麼?此外,它仍然給未定義 – Misaki 2013-04-28 22:02:35
@ user2224801:這意味着,內'woot' *陰影*(將取代)的'VAR了'全局變量'了'與局部變量'了',甚至'var'前行。正如詹姆斯在他的重寫中所展示的那樣,'var'線被提升[「懸掛」到了它出現的函數的頂部。但是,這只是聲明,而不是初始化,所以當用'var'聲明一個變量時,它的初始值是'undefined',並且它只在賦值(或初始化)時獲得另一個值。詳情:[*差,誤解'var' *](http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html) – 2013-04-28 22:05:16
ahaaaa,所以,如果我從活泉除去一個變種,這將解決這個問題。 – Misaki 2013-04-28 22:08:22
的variable declaration (var
keyword)是在woot
功能的範圍懸掛,使其成爲一個局部變量(陰影全局變量a
)。它將被初始化爲undefined
,並返回該值直到您分配給它。
在的時間:
function woot(){
console.log(a);
..the a
犯規存在呢!如果你想使用外a
你需要調用它像:
console.log(window.a);
刪除已在功能上a
,你可以使用,輕鬆現在,這console.log(a);
這將參考外一個(因爲沒有在你的函數了)
否則,使用console.log(window.a);
區分這兩個alphas
。
首先想到:我沒有預料到'5'。你在問什麼?你需要它是'5'嗎? – Bergi 2013-04-28 21:59:46
是的,在我正在編寫的教程中,它應該是5,但是當我嘗試它時,它給出了未定義。 – Misaki 2013-04-28 22:01:20
您可以顯示/鏈接該教程嗎?如果它告訴你應該有一個5,這是錯誤的。 – Bergi 2013-04-28 22:03:57