SyntaxError:在严格模式下使用const


241

我正在使用node.js,并且在中使用的一个js文件const"strict mode"。尝试运行它时,出现错误:

SyntaxError: Use of const in strict mode.

最佳做法是什么?

编辑:

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

@thefourtheye检查chrome,ff工作正常。
Zaheer Ahmed

使用var。添加分号'use strict';
Adrian Preuss

@ZaheerAhmed实际上我正在使用Node.js yaar。它的工作原理很好。
thefourtheye 2014年


更新了最新的Node版本v5.3.0之后,它现在可以正常工作。
zangw

Answers:


284

constlet是2015年的ECMAScript的一部分(又名ES6与和谐),默认情况下在Node.js的0.10或0.12没有启用。从Node.js 4.x开始,“ V8认为稳定的所有发货[ES2015]功能默认情况下在Node.js上已启用,并且不需要任何类型的运行时标志。” Node.js文档概述了默认情况下启用了哪些ES2015功能以及哪些需要运行时标记。因此,通过升级到Node.js 4.x或更高版本,错误应该会消失。

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

node --harmony app.js

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


8
这是最完整,最相关的答案。
zamnuts 2014年

也可以使用标志(而不是文字表达式)节点--harmony --use_strict app.js来应用严格模式,这很好。
Adria 2014年

7
我建议不要使用“ use_strict”标志。它在不是为它编写的解释器中运行其他人的代码。始终使用'use strict';自己,但让第三方代码自行决定。
Thomas Jensen 2014年

1
FWIW我在运行节点v8.1时发现了相同的问题,但是使用了armfh版本(raspberry pi)。
詹姆斯

238

如果在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指令


3
尝试执行步骤2时,出现了“ npm ERR!notsup不支持的npm ERR!notsup与您的操作系统或体系结构不兼容:n@2.1.4”的提示。
VSO

1
根据您的用例,您可能会发现指定node版本更安全。例如,截至撰写本文时,sudo n 6.9.4将安装最新的LTS,sudo n stable将在哪里安装7.4.0。显然,这是一个重大变化,因此请多加注意n stable。或者,sudo n lts安装最新的LTS。
jfmercer

1
适用于centos 6.5。早些时候,我收到以下错误“ SyntaxError:在严格模式下使用const”。谢谢
Himanshu Chauhan

1
这在--harmony标志没有的旧机器上为我解决了这个问题。设置:尝试使用crontab中的脚本启动屏幕npm start监视器会导致严格错误,而从cli中运行该错误却没有。先前的节点版本是在ubuntu 12.04.5 LTS上运行的0.10.48,我遵循此步骤,并将软链接/ usr / bin / node从/ etc / alternatives / node更改为/usr/local/n/versions/node/8.0 .0 / bin / node,一切正常。这次真是万分感谢!
Brian Layman

1
Badass对此表示感谢,它不仅解决了该问题,而且在构建SCA Local时解决了所有固有的小
缺点

22

通常,当针对其执行代码的节点版本比预期的版本旧时,会发生此错误。(即0.12或更高版本)。

如果您使用的是nvm,请确保您使用的节点版本正确。您可以在严格模式下检查node.green上的const兼容性。

我在另一篇文章中发现了类似的问题,并在其中详细发布了我的答案


1
在WebStorm中运行我的Node项目时遇到了这个问题。我在仓库中的本地版本运行的是Node 8.2.1,但是WebStorm看着我的/usr/bin/node文件夹,该文件夹的值为0.10.46。
Shadoninja

20

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

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

1
如何确定刚安装了哪个版本?
Jose Llausas

1
您可以通过运行which node
Steve

另外,在运行“ n stable”时,您还将看到该目录:mkdir:/usr/local/n/versions/node/8.0.0因此,您可以转到/ usr / local / n / versions / node /并查看存在哪些目录。
Brian Layman

@JoseLlausas node --version打印出版本号,例如v0.10.29
Markus

15

这可能不是每个人的解决方案,但对我而言。

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

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


2
和任何代码来说明您上述的“解决方案”?
Kermit_ice_tea

是的,这是我最初的问题。尽管由于过时的centos版本上的节点和gcc版本兼容性问题,无论如何我还是不得不切换到另一台linux服务器。
Robot70 '17

@Kermit_ice_tea问题中的相同代码。该错误位于节点的版本中,使用NVM将其设置为没有该错误的版本会使该代码通过。 nvm use version-number-you-need是您要做的。
boatcoder

8

自从问问题以来,该const关键字的草稿已经成为ECMAScript 2015一部分的生活标准。同样,当前版本的Node.js 支持不带--harmony标志的const声明

有了上面说的,你现在可以运行node app.js,具有app.js

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

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


兆字节MB是十的幂,而兆字节是二的幂MiB。即1MB = 1e61MiB = 1024 * 1024。参见维基百科:Mebibyte
DJDaveMark '18

0

我最近也遇到过类似的问题,并最终获得了此问答。这不是OP所寻找的解决方案,但可能会帮助其他遇到类似问题的人。

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

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

我试图停止并启动该应用程序几次。还尝试再次更新所有内容。没事。直到我跑步时注意到警告pm2 start

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

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


-2

ECMAScript不支持const。因此,在指定严格模式后,您会收到语法错误。如果要使代码与所有浏览器兼容,则需要使用var而不是const。我知道,这不是理想的解决方案,但这就是它的本质。有多种方法可以在JavaScript中创建只读属性(请参见可以在Pure JavaScript中实现只读属性吗?),但我认为根据您的情况,它可能会显得过分杀伤。

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

浏览器兼容性

const的当前实现是Mozilla特定的扩展,不是ECMAScript 5的一部分。Firefox和Chrome(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声明的常量将是块作用域的。


3
const在ECMAScript中6的支持和它的广泛支持:kangax.github.io/compat-table/es6/#const但你在你的答案正确的- 'use strict';const不混合。
dotnetCarpenter 2014年

快速测试显示,const为重新申报在Safari 7,但不是在Opera 21,Chrome 35版和Firefox 29
dotnetCarpenter

21
浏览兼容性
无关紧要


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

对于linux服务器
Ayhmi '17

1
欢迎使用堆栈溢出。提供答案时,最好同时给出一些代码解释。
O. Jones

2
投反对票,因为没有解释。为什么要安装中殿软件包..
Sean83 '17

为什么这样的解决方案有效?需要一个解释。
保罗·伊萨里斯

尽管没有任何解释,但对我来说,该错误仅在运行此处描述的命令后才能解决:npm install -g nave; nave use 6.11.1 +1
Ruben Alves
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.