2014-01-23 65 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引擎将首先对其进行处理。