SyntaxError:在严格模式下使用const

时间:2014-03-24 07:12:06

标签: javascript node.js

我正在使用node.js,在我的一个js文件中,我在const中使用"strict mode"。当试图运行它时,我收到一个错误:

SyntaxError: Use of const in strict mode.

这样做的最佳做法是什么?

编辑:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB

11 个答案:

答案 0 :(得分:276)

constlet是ECMAScript 2015(a.k.a. ES6和Harmony)的一部分,默认情况下未在Node.js 0.10或0.12中启用。从Node.js 4.x开始,“所有出货[ES2015]功能,V8认为稳定,默认情况下在Node.js上打开,不需要任何类型的运行时标志。” Node.js docs has an overview of what ES2015 features are enabled by default, and which who require a runtime flag。因此,通过升级到Node.js 4.x或更新版本,错误应该消失。

在Node.js 0.10和0.12中启用一些ECMAScript 2015功能(包括constlet);使用和声标志启动节点程序,否则会出现语法错误。例如:

node --harmony app.js

这完全取决于您的严格js所在的一侧。我建议在服务器端使用带有const声明的严格模式,并使用和声标志启动服务器。对于客户端,您应该使用Babel或类似工具将ES2015转换为ES5,因为并非所有客户端浏览器都支持const声明。

答案 1 :(得分:231)

如果在nodejs中发生这种情况,则归因于较旧版本的nodejs。使用

更新节点

1)清除NPM的缓存:

sudo npm cache clean -f

2)安装一个名为'n'的小助手

sudo npm install -g n

3)安装最新的稳定NodeJS版本

sudo n stable

更新取自https://stackoverflow.com/a/19584407/698072

的nodejs指令

答案 2 :(得分:22)

通常,当执行代码的节点版本早于预期时,会发生此错误。 (即0.12或更早)。

如果您使用的是nvm,请确保您使用的节点版本正确。您可以查看compatibility on node.green for const under strict mode

我在另一篇文章中发现了类似的问题并发布了我的回答there in detail

答案 3 :(得分:19)

更新节点后的一个重要步骤是将节点二进制文件链接到最新安装的节点版本

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  

答案 4 :(得分:13)

这可能不是每个人的解决方案,但它适合我。

如果您使用的是NVM,则可能没有为正在运行的代码启用正确版本的节点。重新启动后,您的默认节点版本将更改回系统默认值。

在使用本机工作正常的react-native时遇到了这个问题。只需使用nvm即可使用正确版本的节点来解决此问题。

答案 5 :(得分:8)

自提出问题以来,const关键字的草稿已经成为ECMAScript 2015的一部分。此外,当前版本的Node.js supports const declarations没有--harmony标志。

如上所述,您现在可以node app.js运行app.js

'use strict';
const MB = 1024 * 1024;
...

获得语法糖和严格模式的好处。

答案 6 :(得分:0)

我最近遇到了类似的问题,并最终完成了此问答。这不是OP寻求的解决方案,但可能会帮助其他遇到类似问题的人。

我正在使用PM2运行一个项目,并且在给定的登台服务器中,我有一个非常旧的Node,NPM和PM2版本。我更新了所有内容,但是仍然保持相同的错误:

  

SyntaxError:在严格模式下使用const。

我试图停止并启动应用程序多次。还尝试再次更新所有内容。没事。直到我运行pm2 start时发现警告:

  

>>>>内存PM2已过期,请执行以下操作:
  >>>> $ pm2更新
  内存PM2版本:0.15.10
  本地PM2版本:3.2.9

陷阱!运行pm2 update之后,我终于能够按预期运行该应用程序。不再有“在严格模式下常量”错误。

答案 7 :(得分:0)

我使用 pm2 来启动和维护节点进程。

在 CLI 中它运行良好。

which node
/usr/local/bin/node
node -v
v10.15.0

但是,我设置了一个 cronjob 并且出现了语法错误。

然后编写了一个 cronjob 来检查 which nodenode -v,令人惊讶的是,它是不同的路径和版本。

which node
/usr/bin/node
node -v
v0.10.48

为了修复 cronjob,我必须为 pm2 使用标志 --interpreter,如下所示:

pm2 start dist/server.js --interpreter=/usr/local/bin/node 

答案 8 :(得分:-1)

ECMAScript不支持

const。因此,在指定严格模式后,会出现语法错误。如果希望代码与所有浏览器兼容,则需要使用var而不是const。我知道,不是理想的解决方案,但它就是它的本质。有一些方法可以在JavaScript中创建只读属性(请参阅Can Read-Only Properties be Implemented in Pure JavaScript?),但我认为根据您的情况可能会有些过分。

以下是来自MDN的浏览器兼容性说明:

浏览器兼容性

  

const的当前实现是特定于Mozilla的扩展   并且不是ECMAScript 5的一部分。它在Firefox&铬   (V8)。从Safari 5.1.7和Opera 12.00开始,如果定义变量   在这些浏览器中使用const,您仍然可以在以后更改其值。它   Internet Explorer 6-10不支持,但包含在   Internet Explorer 11. const关键字当前声明了   函数作用域中的常量(如用var声明的变量)。

     

Firefox,至少从版本13开始,如果你这样做会引发TypeError   重新宣布一个常数。主要浏览器都没有发出任何通知   如果为常量指定另一个值,则会出现错误。返回值   这样的操作是指定的新值,但是   重新分配仅在Firefox和Chrome中失败(至少   从版本20开始。)

     

const将由ECMAScript 6定义,但不同   语义。与使用let语句声明的变量类似,   用const声明的常量将是块作用域。

答案 9 :(得分:-2)

随着Chrome 41的发布,可以在严格模式下使用const。 目前,Chrome 41 Beta is already released并支持它。

答案 10 :(得分:-4)

cd /
npm install -g nave
nave use 6.11.1
node app.js