【问题标题】:a variable defined with let is not defined in a same scope IIFE使用 let 定义的变量未在同一范围 IIFE 中定义
【发布时间】:2018-11-07 06:43:04
【问题描述】:

我在下面有一些代码。我希望它可以正确记录ab,但结果,它会将a 记录为1,b 未定义错误:

Uncaught ReferenceError: b is not defined

function foo(){
    var a = 1
    let b = 2
    (function bar() {
        console.log(a)
        console.log(b)
    }())
}
console.log(foo());

如果我更改代码以将 bar 作为函数声明,一切都很好

function foo(){
    var a = 1
    let b = 2
    function bar() {
        console.log(a)
        console.log(b)
    }
    bar()
}
console.log(foo());

我知道一些关于函数作用域、块作用域、提升的事情。但我真的不明白会发生什么使b '未定义'

以上所有代码均在 Chrome 66 的 devTools 中运行

【问题讨论】:

    标签: scope var let iife


    【解决方案1】:

    这是不依赖自动分号插入 (ASI) 的原因之一,除非您和每个可能处理代码的程序员都非常清楚 ASI 的规则。

    您的代码试图将 2 作为函数调用,并将调用 bar 函数的结果作为参数传递,因为以下 IIFE 周围的 () 可以合理地(根据 ASI 规则)被视为let b = 声明。由于调用 bar 发生在声明 b 之前(直到其初始化程序运行后才声明),您会收到错误。

    如果我们稍微更改换行符,您可以看到发生了什么:

    function foo(){
        var a = 1
        let b = 2(function bar() {
            console.log(a)
            console.log(b)
        }());
    }
    console.log(foo());

    添加; 修复它:

    function foo(){
        var a = 1;
        let b = 2;
        (function bar() {
            console.log(a);
            console.log(b);
        }());
    }
    console.log(foo());

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多