Javascript闭包和内部范围

时间:2014-01-23 10:45:12

标签: javascript closures scope hoisting

嘿所有我正在尝试理解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}}。这是为什么?

3 个答案:

答案 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语句运行之前在函数范围内创建一个局部变量。

(在达到该行之前,它不会为其赋值。)

What is hoisted?

答案 2 :(得分:0)

每当你在javascript中声明一个变量时,javascript引擎首先初始化变量,然后处理下一个方法。即使你在最后声明变量,javascript引擎也会先处理它。