javascript - 为什么在重新分配错误之前在新 block 中使用 let 变量?

标签 javascript node.js ecmascript-6

<分区>

我有以下文件 https://www.codementor.io/cchilder/draft/bcgnrvw5p我试图解释这一点的地方:

// declare variables
const x = 1;
let y = 2;
var z = 3;

console.log(`Global scope - x, y, z: ${x}, ${y}, ${z}`);

if (true) {
    console.log(`A new block scope - x, y, z: ${x}, ${y}, ${z}`);

    // redeclare variables
    // const x = 4;
    let y = 5;
    var z = 6;
}

if block 的顶部,未定义 y:

$ node variables.js 
Global scope - x, y, z: 1, 2, 3
/Users/cchilders/variables.js:9
    console.log(`A new block scope - x, y, z: ${x}, ${y}, ${z}`);
                                                      ^

ReferenceError: y is not defined

我没想到会这样,也不知道该如何解释。我现在:

当我们使用相同的名称重新声明这些变量时,我们删除了对 block 范围内的这些名称的访问:

...

if (true) {
    // inside this block, we lost access to the old x and y because they're going to be redeclared inside this block scope...but we can't use them yet, they haven't been declared yet
    console.log(`A new block scope - x, y, z: ${x}, ${y}, ${z}`);

    // redeclare variables
    const x = 4;
    let y = 5;
    // now we can use the new x and y, 4 and 5 respectively
    var z = 6;
}
...

为什么会发生这种情况,JavaScript/Node 解释器究竟是如何读取导致该错误的代码的?

最佳答案

只要新 block 属于旧范围,就可以在新 block 中使用旧的 xy,但是既然你已经创建了另一个 y 在带有 let 的新 block 中,根据 ES6,新的 y 将用 ' 覆盖旧的 y unassigned' 的值,一旦在没有赋值的情况下被访问,就会报错。

if(true) {
    console.log(y);
    {
        const x;
        let y;
        var z;
        // your code
    }
}

关于javascript - 为什么在重新分配错误之前在新 block 中使用 let 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45901489/

相关文章:

javascript - 在浏览器中覆盖 TAB

javascript - findByIdAndRemove 导致错误

javascript - .js 文件适用于 chrome 和 firefox 但不适用于 IE

javascript - 解构值并将其重命名为字符串键

javascript - 在 ReactJS 中设置状态的条件(三元)运算符

javascript - 在 Meteor 中为 CloudMQTT 配置 mqttConnect 选项

javascript - js : promises inside a while- true loop

java - 如何编写可在 Java 和 C++ 中解析的脚本

node.js - 类型错误 : Converting circular structure to JSON when changed to NodeJS Async Await

node.js - 使用 Docker 构建应用程序堆栈