嘿所有我正在尝试理解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
我希望true
的所有输出为a
,但undefined
的第一行woot()
为{{1}}。这是为什么?
答案 0 :(得分:1)
当你在函数内的任何地方声明一个变量时,变量将成为该函数的本地变量,因为所有变量声明都被移动到函数的顶部。
在你的情况下,
console.log('a == 5 woot: ' + (a == 5).toString());
var a = 6;
在您将6
分配给a
之前,a
将为undefined
,但范围将是本地的。
您可能希望了解MDN docs中的变量提升示例。
按照同样的MDN var doc,
用var声明的变量的范围是封闭函数
答案 1 :(得分:1)
var
语句已悬挂。
即使它出现在console.log
语句下面,var a = 6;
在console.log
语句运行之前在函数范围内创建一个局部变量。
(在达到该行之前,它不会为其赋值。)
答案 2 :(得分:0)
每当你在javascript中声明一个变量时,javascript引擎首先初始化变量,然后处理下一个方法。即使你在最后声明变量,javascript引擎也会先处理它。