首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量已在ES6开关块中声明

常量已在ES6开关块中声明
EN

Stack Overflow用户
提问于 2015-10-29 01:33:41
回答 5查看 13.7K关注 0票数 33

考虑文件sample.es6

代码语言:javascript
复制
switch (1) {
    case 1:
        const foo = 1;
        break;
    case 2:
        const foo = 2;
        break;
}

如果我用Node运行它,我会得到

代码语言:javascript
复制
$ 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;

EN

回答 5

Stack Overflow用户

发布于 2018-03-19 00:29:32

你可以围绕你的案例创建作用域块,编译器会很高兴的:

代码语言:javascript
复制
switch (1) {
    case 1: {
        // notice these extra curly braces
        const foo = 1;
        break;
    }
    case 2: {
        const foo = 2;
        break;
    }
}

如果您需要更多上下文,请阅读answer from Igor

票数 70
EN

Stack Overflow用户

发布于 2015-10-29 01:39:25

您将获得一个SyntaxError,因为您在同一范围内重新声明了一个变量;一个switch语句contains only one underlying block,而不是每个case一个块。

JavaScript在编译时抛出错误。"Node不应评估const foo = 2;“是无关紧要的,因为此错误发生在Node评估任何内容之前。

const (以及许多新的ES6特性,例如新的模块规范)的一个目的是使编译器能够进行一些静态分析。const告诉编译器,变量永远不会被重新赋值,这使得引擎可以更有效地处理它。

当然,这需要编译时检查以确保变量确实不会被重新赋值(或重新声明),这就是您看到错误的原因。

票数 19
EN

Stack Overflow用户

发布于 2017-02-01 01:45:37

您可以使用立即调用的函数表达式(IIFE)进行常量赋值:

代码语言:javascript
复制
const foo=(function(){
  switch (1) {
    case 1:
      return 1;
      break;
    case 2:
      return 2;
      break;
  }
})();

console.log('foo = '+foo); /* foo = 1 */

或者,您可以使用大括号在case内创建一个作用域,但不能访问foo外部开关块:

代码语言:javascript
复制
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 */
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33397782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档