2014-01-23 102 views
1

嘿,所有我試圖理解JavaScript封鎖和對這段代碼一個簡單的問題,的Javascript閉包和內部範圍

var a = 5; 

function woot() { 
    console.log('a == 5 woot: ' + (a == 5).toString()); 

    var a = 6; 

    function test() { 
    console.log('a == 6 test: ' + (a == 6).toString()); 
    } 

    test(); 
} 

console.log('a == 5 outside: ' + (a == 5).toString()); 

woot(); 

console.log('a == 5 end: ' + (a == 5).toString()); 

輸出:

a == 5 outside: true 
a == 5 woot: false 
a == 6 test: true 
a == 5 end: true 

我期待在woot()的第一行中,所有輸出爲true,但是aundefined。爲什麼是這樣?

回答

1

當您在函數內的任何位置聲明變量時,該變量將變爲該函數的局部變量,因爲所有變量聲明都將移至該函數的頂部。

在你的情況,

console.log('a == 5 woot: ' + (a == 5).toString()); 

    var a = 6; 

分配之前6aaundefined,但範圍將是本地的。

您可能想了解MDN docs中的變量提升示例。

而作爲每相同MDN var doc

使用var聲明的變量的範圍是封閉函數

1

var語句懸掛

即使它出現在console.log語句的下面,var a = 6;在運行console.log語句之前在該函數的作用域中創建了一個局部變量。

(它不會爲其分配值,直到達到該行爲止)。

What is hoisted?

0

每當你聲明的JavaScript變量,JavaScript引擎首先初始化變量,然後處理,即使你在最後聲明變量未來methods..hence,JavaScript引擎將首先對其進行處理。