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)
如果我设置check为true,那么代码可以正常工作并打印
2
Run Code Online (Sandbox Code Playgroud)
如果我设置check为false,那么代码给出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?
提升和暂时死区!
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