【问题标题】:Weird output with javascript closure/scope带有 javascript 闭包/作用域的奇怪输出
【发布时间】:2016-03-29 03:03:52
【问题描述】:

我是 javascript 新手,我试图理解闭包/外壳的东西,这里有一些简单的代码:

var i = 10;
var g = 3;
console.log("Commencing countdown, engines on");

while ( i > 0 )
{
    console.log(i);
    i--;
    var g = 6;
}

console.log("this is g " + g );

当我运行这个时,我得到“这是 g 6”,但它不应该是 3,因为这是来自全局范围的 g,而 g = 6 只在较低的范围内完成?

非常感谢您的帮助。

【问题讨论】:

  • JS 中没有块作用域
  • @Teemu 在 ES6 块作用域中被广泛使用,无论你是使用 let 声明一个块作用域变量还是简单地在 {} 中包装一个 sn-p

标签: javascript scope closures


【解决方案1】:

while 循环确实为每次迭代创建了一个块作用域,但是,通过使用var,您将在函数作用域而不是块作用域中定义该变量。如果您改为使用let,它将保持外部g var 不变。

请注意,这仅在现代浏览器中受支持。

var i = 10;
var g = 3;
console.log("Commencing countdown, engines on");

while ( i > 0 )
{
    console.log(i); //1-10
    i--;
    let g = 6;
}

console.log("this is g " + g ); // 3

您的原始代码被解析为:

var i = 10;
var g = 3;
console.log("Commencing countdown, engines on");

while ( i > 0 )
{
    console.log(i); // 1-10
    i--;
    g = 6; // var was hoisted, so now this is setting the value of `g` in the function scope rather than the block scope.
}

console.log("this is g " + g ); // 6

当然有你看到的结果。

【讨论】:

    【解决方案2】:

    javascript 具有函数范围而不是块范围(除非您使用let)。所以,

    while ( i > 0 )
    {
        console.log(i);
        i--;
        var g = 6;
    }
    

    所以g 这里不是一个新变量,而只是一个全局变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多