1

嘿,我正在尝试理解 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在第一行。为什么是这样?aundefinedwoot()

4

3 回答 3

1

当您在函数内的任何位置声明变量时,该变量将成为该函数的局部变量,因为所有变量声明都移至函数顶部。

在你的情况下,

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

  var a = 6;

在分配6给之前aa将是undefined,但范围将是本地的。

您可能想阅读MDN 文档中的变量提升示例。

并且根据相同的MDN var doc

用 var 声明的变量的作用域是封闭函数

于 2014-01-23T10:46:22.713 回答
1

var声明被吊起

即使它出现在语句下方,也会console.log在语句运行var a = 6;之前在函数范围内创建一个局部变量console.log

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

吊什么?

于 2014-01-23T10:46:59.513 回答
0

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

于 2014-01-23T10:49:29.920 回答