考虑文件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;。
发布于 2018-03-19 00:29:32
你可以围绕你的案例创建作用域块,编译器会很高兴的:
switch (1) {
case 1: {
// notice these extra curly braces
const foo = 1;
break;
}
case 2: {
const foo = 2;
break;
}
}如果您需要更多上下文,请阅读answer from Igor。
发布于 2015-10-29 01:39:25
您将获得一个SyntaxError,因为您在同一范围内重新声明了一个变量;一个switch语句contains only one underlying block,而不是每个case一个块。
JavaScript在编译时抛出错误。"Node不应评估const foo = 2;“是无关紧要的,因为此错误发生在Node评估任何内容之前。
const (以及许多新的ES6特性,例如新的模块规范)的一个目的是使编译器能够进行一些静态分析。const告诉编译器,变量永远不会被重新赋值,这使得引擎可以更有效地处理它。
当然,这需要编译时检查以确保变量确实不会被重新赋值(或重新声明),这就是您看到错误的原因。
发布于 2017-02-01 01:45:37
您可以使用立即调用的函数表达式(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 */https://stackoverflow.com/questions/33397782
复制相似问题