考虑文件sample.es6
switch (1) {
case 1:
const foo = 1;
break;
case 2:
const foo = 2;
break;
}
如果我使用Node运行它
$ node --version
v4.2.11
$ node sample.es6
/tmp/sample.es6:6
const foo = 2;
^
SyntaxError: Identifier 'foo' has already been declared
at Object.<anonymous> (/tmp/sample.es6:1:11)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:467:10)
at startup (node.js:134:18)
at node.js:961:3
为什么我收到此错误?节点不应评估const foo = 2;
。
答案 0 :(得分:13)
您正在获得SyntaxError
因为您正在同一范围内重新声明变量;一个switch
语句contains only one underlying block,而不是每case
个一个块。
JavaScript在编译时时抛出错误。 “节点不应该评估const foo = 2;
”是无关紧要的,因为在Node评估任何内容之前会发生此错误。
const
(以及许多新的ES6功能,例如新模块规范)的一个目的是使编译器能够进行一些静态分析。 const
告诉编译器永远不会重新分配变量,这样引擎就可以更有效地处理变量。
当然,这需要进行编译时检查以确保变量确实从未被重新分配(或重新声明),这就是您看到错误的原因。
答案 1 :(得分:5)
您可以使用立即调用函数表达式(IIFE)进行常量赋值:
const foo=(function(){
switch (1) {
case 1:
return 1;
break;
case 2:
return 2;
break;
}
})();
console.log('foo = '+foo); /* foo = 1 */
另外,你可以用大括号在case中创建一个范围,但你不能访问开关区外的foo:
switch (1) {
case 1: {
const foo = 1;
console.log(foo+' from inside'); /* 1 from inside */
} break;
case 2: {
const foo = 2;
console.log(foo+' from inside');
} break;
}
console.log(foo+' from outside'); /* foo is not defined */
答案 2 :(得分:3)
您可以围绕您的案例创建范围块,并且eslint会很高兴:
switch (1) {
case 1: {
// notice these extra curly braces
const foo = 1;
break;
}
case 2: {
const foo = 2;
break;
{
}
答案 3 :(得分:0)
使用临时变量确定值,然后在确定值后设置常量。
let bar;
switch (1) {
case 1:
bar = 1;
break;
case 2:
bar = 2;
break;
}
const foo = bar;
答案 4 :(得分:0)
如果您希望在 case 语句中创建范围,则应使用(IIFE) 立即调用函数表达式。它允许您在 case 语句中创建所需的其他范围。
function (value) {
switch (value) {
case 1:
return (function() {
const foo = 1
return foo
}())
break;
case 2:
return (function() {
const foo = 2
return foo
}())
break;
}
}
以下是https://jsfiddle.net/hermanleus/e4ceq7xt/2/
的示例希望有所帮助