SyntaxError:在严格模式下使用 const

Posted

技术标签:

【中文标题】SyntaxError:在严格模式下使用 const【英文标题】:SyntaxError: Use of const in strict mode 【发布时间】:2014-05-01 10:28:26 【问题描述】:

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

SyntaxError: Use of const in strict mode.

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

编辑:

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

【问题讨论】:

@thefourtheye 检查 chrome,ff 工作正常。 使用var。添加分号'use strict'; @ZaheerAhmed 实际上我正在使用 Node.js yaar。它工作得很好。 啊...在ideone.com中失败 更新最新Node版本v5.3.0后,现在运行良好。 【参考方案1】:

constlet 是 ECMAScript 2015(又名 ES6 和 Harmony)的一部分,在 Node.js 0.10 或 0.12 中默认未启用。从 Node.js 4.x 开始,“V8 认为稳定的所有交付 [ES2015] 功能在 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 声明。

【讨论】:

这是最完整和最相关的答案。 严格模式也可以使用标志(而不是文字表达式)节点 --harmony --use_strict app.js 应用,这很好。 我建议不要使用“use_strict”标志。它在不是为它编写的解释器中运行其他人的代码。始终自己使用'use strict';,但让第三方代码自行决定。 FWIW 我发现运行 node v8.1 但 armfh 版本 (raspberry pi) 的问题相同。【参考方案2】:

如果这发生在 nodejs 中,那是由于 nodejs 的旧版本。使用更新节点,

1) 清除 NPM 的缓存:

sudo npm cache clean -f

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

sudo npm install -g n

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

sudo n stable

更新来自https://***.com/a/19584407/698072的nodejs指令

【讨论】:

我在尝试执行第 2 步时收到此“npm ERR!notsup Unsupported npm ERR!notsup 与您的操作系统或架构不兼容:n@2.1.4”。好时光。 根据您的用例,您可能会发现指定node 版本更安全。例如,在撰写本文时,sudo n 6.9.4 将安装最新的 LTS,而sudo n stable 将安装 7.4.0。显然,这是一个重大变化,所以请注意n stable。或者,sudo n lts 安装最新的 LTS。 在 centos 6.5 上工作。早些时候我收到以下错误“ SyntaxError:在严格模式下使用 const ”。谢谢 这解决了我在 --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 一切正常。谢谢你! 非常感谢,它不仅解决了这个问题,而且解决了构建 SCA Local 时所有固有的小问题【参考方案3】:

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

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

我在另一个帖子中发现了类似的问题,并发布了我的答案there in detail

【讨论】:

我在 WebStorm 中运行我的 Node 项目时遇到了这个问题。我在 repo 中的本地版本运行的是 Node 8.2.1,但 WebStorm 查看了我的 /usr/bin/node 文件夹,它有 0.10.46。【参考方案4】:

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

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

【讨论】:

我怎样才能知道刚刚安装了哪个版本? 你可以通过运行which node找到你当前版本节点的安装位置 运行“n stable”时你也会看到目录 在这一行中: mkdir : /usr/local/n/versions/node/8.0.0 所以你可以去 /usr/ local/n/versions/node/ 并查看存在哪些目录。 @JoseLlausas node --version 打印出版本号,例如v0.10.29【参考方案5】:

这可能不是适合所有人的解决方案,但适合我。

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

在使用运行良好的 react-native 时遇到了这个问题。只需使用 nvm 使用正确版本的 node 即可解决此问题。

【讨论】:

和任何代码来说明你上面所说的“解决方案”? 是的,这是我最初的问题。尽管由于节点和 gcc 版本在过时的 centos 版本上的兼容性问题,我不得不切换到另一台 linux 服务器。 @Kermit_ice_tea 问题中的相同代码。该错误在节点的版本中,使用 NVM 将其设置为没有该错误的版本使该代码通过。 nvm use version-number-you-need 是你所要做的。【参考方案6】:

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

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

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

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

【讨论】:

一兆字节 MB 是十的幂,而兆字节 MiB 是二的幂。即1MB = 1e61MiB = 1024 * 1024。参见***:Mebibyte【参考方案7】:

我最近遇到了类似的问题,并最终参加了此问答。这不是 OP 正在寻找的解决方案,但可能会帮助其他有类似问题的人。

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

语法错误:在严格模式下使用 const。

我多次尝试停止和启动应用程序。还尝试再次更新所有内容。没有任何效果。直到我在运行pm2 start 时注意到警告:

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

明白了!在运行pm2 update 之后,我终于能够让应用程序按预期运行。不再出现“严格模式下的 const”错误。

【讨论】:

【参考方案8】:

我使用 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 

【讨论】:

【参考方案9】:

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

【讨论】:

为了澄清,我想评论一下,由于 OP 要求使用 Node.js,浏览器兼容性不相关。然而不知何故,这个答案有 4 个赞成票,而且它掩盖了其他更相关的答案。【参考方案10】:
cd /
npm install -g nave
nave use 6.11.1
node app.js

【讨论】:

适用于linux服务器 欢迎来到 Stack Overflow。提供答案时,最好同时给出一些代码解释。 投反对票,因为没有解释。为什么要安装 nave 包.. 为什么这样的解决方案会奏效?需要解释一下。 虽然没有解释,但对我来说,只有在运行这里描述的命令后才能解决错误:npm install -g nave; nave use 6.11.1+1【参考方案11】:

ECMAScript 不支持 const。所以在你指定严格模式后,你会得到语法错误。如果您希望您的代码与所有浏览器兼容,则需要使用 var 而不是 const。我知道,这不是理想的解决方案,但它就是这样。有一些方法可以在 javascript 中创建只读属性(请参阅 Can Read-Only Properties be Implemented in 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 开始,如果你 重新声明一个常数。主流浏览器均不产生任何通知 如果为常量分配另一个值,则会出现错误。返回值 这样的操作是分配的新值的操作,但是 仅在 Firefox 和 Chrome 中重新分配不成功(至少 从第 20 版开始)。

const 将由 ECMAScript 6 定义,但有不同的 语义。类似于用 let 语句声明的变量, 用 const 声明的常量将是块范围的。

【讨论】:

const 在 ECMAScript 6 中得到支持并得到广泛支持:kangax.github.io/compat-table/es6/#const 但你的答案是对的 - 'use strict';const 不能混用。 快速测试表明const 在 Safari 7 中可重新声明,但在 Opera 21、Chrome 35 和 Firefox 29 中不可重新声明。 浏览兼容性无关紧要...这是 Node.js

以上是关于SyntaxError:在严格模式下使用 const的主要内容,如果未能解决你的问题,请参考以下文章

PM2 - SyntaxError:严格模式之外尚不支持块范围声明

Vue init webpack测试-未创建项目-严格模式错误?

cordova打包APK,SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported

javascript 面向对象学习——this,bindapply 和 call共同及入门技巧

JS严格模式

在严格模式下复制 arguments.callee