switch 语句中的 const 和 let 变量遮蔽

asa*_*ion 5 javascript v8 node.js

我有以下代码。唯一有趣的部分是我productId在第二个开关案例中重新声明。

let productId = 1;

const check = true;

switch (check) {
  case false:
    console.log(productId);
    break;
  case true:
    let productId = 2;
    console.log(productId);
    break;
}
Run Code Online (Sandbox Code Playgroud)

如果我设置checktrue,那么代码可以正常工作并打印

2
Run Code Online (Sandbox Code Playgroud)

如果我设置checkfalse,那么代码给出ReferenceError

/home/osama/workspace/test/javascript.js:7
        console.log(productId);
                    ^

ReferenceError: productId is not defined
    at Object.<anonymous> (/home/osama/workspace/test/javascript.js:7:21)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
Run Code Online (Sandbox Code Playgroud)

如果我使用var声明,productId那么无论 的值如何,代码都可以正常工作check

我意识到该let/const语句以某种方式隐藏了全局变量,但我的问题是:

为什么在 switch 语句中声明变量会导致全局变量变得未定义并抛出异常ReferenceError

Nik*_*ora 1

提升和暂时死区!

let并被const提升到最近的块,所以它变成这样:

switch (check) {
  let productId;
  case false:
    console.log(productId);
    break;
  case true:
    productId = 2;
    console.log(productId);
    break;
}
Run Code Online (Sandbox Code Playgroud)

因此,由于temporal dead zone,出现了ReferenceError