2013-04-28 86 views
0

我有這樣一段代碼變量和函數範圍在javascript

var a = 5; 
function woot(){ 
    console.log(a); 
    var a = 6; 
    function test(){ console.log(a);} 
    test(); 
    }; 
woot(); 

我期待5和6作爲輸出,但我有不確定和6代替。

有什麼想法?

+0

首先想到:我沒有預料到'5'。你在問什麼?你需要它是'5'嗎? – Bergi 2013-04-28 21:59:46

+0

是的,在我正在編寫的教程中,它應該是5,但是當我嘗試它時,它給出了未定義。 – Misaki 2013-04-28 22:01:20

+1

您可以顯示/鏈接該教程嗎?如果它告訴你應該有一個5,這是錯誤的。 – Bergi 2013-04-28 22:03:57

回答

4

變量聲明懸掛在它們出現的範圍的頂部。你的代碼是這樣解釋:

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

+0

我無法理解這個區別,以及懸掛的含義是什麼?此外,它仍然給未定義 – Misaki 2013-04-28 22:02:35

+4

@ user2224801:這意味着,內'woot' *陰影*(將取代)的'VAR了'全局變量'了'與局部變量'了',甚至'var'前行。正如詹姆斯在他的重寫中所展示的那樣,'var'線被提升[「懸掛」到了它出現的函數的頂部。但是,這只是聲明,而不是初始化,所以當用'var'聲明一個變量時,它的初始值是'undefined',並且它只在賦值(或初始化)時獲得另一個值。詳情:[*差,誤解'var' *](http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html) – 2013-04-28 22:05:16

+0

ahaaaa,所以,如果我從活泉除去一個變種,這將解決這個問題。 – Misaki 2013-04-28 22:08:22

0

variable declaration (var keyword)woot功能的範圍懸掛,使其成爲一個局部變量(陰影全局變量a)。它將被初始化爲undefined,並返回該值直到您分配給它。

0

在的時間:

function woot(){ 
console.log(a); 

..the a犯規存在呢!如果你想使用外a你需要調用它像:

console.log(window.a); 

刪除已在功能上a,你可以使用,輕鬆現在,這console.log(a);這將參考外一個(因爲沒有在你的函數了)

否則,使用console.log(window.a);區分這兩個alphas