Javascript 闭包和内部作用域

标签 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

我期望所有输出都是 trueawoot()< 的第一行是 undefined/。这是为什么?

最佳答案

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

在你的情况下,

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

  var a = 6;

在将 6 分配给 a 之前,a 将是 undefined,但作用域是局部的。

您可能想阅读 MDN docs 中的变量提升示例.

并且按照相同的MDN var doc ,

The scope of a variable declared with var is the enclosing function

关于Javascript 闭包和内部作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305856/

相关文章:

javascript - requestAnimationFrame [now] 与 performance.now() 时间差异

作为可选函数参数的 PHP 闭包

javascript:递归匿名函数?

javascript - 论点在词汇环境中的位置在哪里?

javascript - 以编程方式更改 google chrome 默认打印机

javascript - 如何使用 jquery regex 将字符串中的链接替换为可点击的版本?

Javascript为什么IE不执行这段代码?

javascript - 闭包 - 编译阶段与解释阶段 javascript

ios - 字符串比较(>)在不同平台返回不同结果?

C++:相当于使用命名空间来定义类?