SyntaxError:strictモードでのconstの使用


241

私はnode.jsを使用constしていて、私ので使用しているjsファイルの1つで"strict mode"。実行しようとすると、エラーが発生します。

SyntaxError: Use of const in strict mode.

これを行うためのベストプラクティスは何ですか?

編集:

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

@thefourtheyeはChromeでチェックし、ffは正常に動作しています。
Zaheer Ahmed 2014

使用しますvar。セミコロンを追加'use strict';
Adrian Preuss

@ZaheerAhmed実際には、Node.js yaarを使用しています。それでうまくいきます。
thefourtheye 2014年

ああ...で失敗ideone.com
thefourtheye

最新のノードバージョンv5.3.0を更新した後、正常に動作します。
zangw

回答:


284

constそしてlet(ES6とハーモニー別名)のECMAScript 2015の一部であり、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機能の一部(constおよびを含むlet)を有効にするため。調和フラグを使用してノードプログラムを開始しないと、構文エラーが発生します。例えば:

node --harmony app.js

厳密なjsがどちら側にあるかによります。constサーバー側で宣言を使用してストリクトモードを使用し、harmonyフラグを使用してサーバーを起動することをお勧めします。すべてのクライアントブラウザーが宣言をサポートしているわけではないため、クライアント側では、Babelまたは同様のツールを使用してES2015をES5に変換する必要がありますconst


8
これが最も完全で適切な答えです。
zamnuts 2014年

厳密モードは、フラグ(リテラル式ではなく)ノードを使用して適用することもできます--harmony --use_strict app.jsこれはすばらしいことです。
アドリア2014

7
「use_strict」フラグを使用しないようにアドバイスします。それは書かれていないインタプリタで他の誰かのコードを実行しています。常に'use strict';自分自身を使用しますが、サードパーティのコードが自分で決めるようにします。
トーマスジェンセン

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 2016

1
ユースケースによっては、nodeバージョンを指定した方が安全な場合があります。たとえば、この記事の執筆時点では、sudo n 6.9.4は最新のLTS sudo n stableをインストールし、はをインストールし7.4.0ます。明らかに、これは重大な変更であるため、に注意してくださいn stable。または、sudo n lts最新のLTSをインストールします。
jfmercer 2017年

1
CentOS 6.5で動作します。以前、次のエラー「SyntaxError:strictモードでのconstの使用」が発生しました。ありがとう
Himanshu Chauhan

1
これにより、レガシーマシンで--harmonyフラグが解決しない問題が解決しました。セットアップ:crontabのスクリプトを使用して画面npm開始モニターを起動しようとすると、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とすべてが動作しました。これありがとう!
ブライアンレイマン2017年

1
このためワルのおかげで、それだけでその問題を解決しますが、すべての固有の少しの弱点SCAローカルを構築していない
jk121960

22

通常、このエラーは、コードが実行されているノードのバージョンが予想よりも古い場合に発生します。(つまり、0.12以前)。

nvmを使用している場合は、使用しているノードのバージョンが正しいことを確認してください。strictモードでconstのnode.green互換性を確認できます

私は別の投稿で同様の問題を見つけ、そこに私の答えを詳しく投稿しました


1
WebStormでNodeプロジェクトを実行しているときにこれに遭遇しました。リポジトリ内のローカルバージョンはノード8.2.1を実行していましたが、WebStorm /usr/bin/nodeは0.10.46が含まれている私のフォルダーを調べました。
Shadoninja

20

ノードを更新した後の重要なステップの1つは、ノードバイナリを最新のインストール済みノードバージョンにリンクすることです

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

1
インストールされたばかりのバージョンを確認するにはどうすればよいですか?
Jose Llausas 2017

1
現在のバージョンのノードがインストールされている場所を見つけるには、次のwhich node
Steve

また、「n stable」を実行すると、ディレクトリが表示されます。この行で:mkdir:/usr/local/n/versions/node/8.0.0したがって、/ usr / local / n / versions / node /に移動できます。存在するディレクトリを確認します。
ブライアンレイマン2017年

@JoseLlausas node --versionはバージョン番号を出力します。例v0.10.29
Markus

15

これはおそらく皆のための解決策ではありませんが、それは私のためでした。

NVMを使用している場合は、実行しているコードに対して適切なバージョンのノードを有効にしていない可能性があります。再起動すると、ノードのデフォルトバージョンがシステムデフォルトに戻ります。

正常に動作していた反応ネイティブで作業するときにこれに遭遇していました。この問題を解決するには、nvmを使用して適切なバージョンのノードを使用するだけです。


2
上記の「解決策」を説明するコードはありますか?
Kermit_ice_tea

はい、これは私の最初の問題でした。とにかく、古いcentosバージョンでのノードとgccのバージョンの互換性の問題のため、とにかく別のLinuxサーバーに切り替える必要がありました。
Robot70

@Kermit_ice_tea質問の同じコード。バグはノードのバージョンにあり、NVMを使用して、そのバグがないバージョンに設定すると、そのコードはパスします。 nvm use version-number-you-needあなたがしなければならないすべてです。
ボートコーダー

8

質問が出されたときから、constキーワードのドラフトはECMAScript 2015の一部としてすでに生きている標準です。また、Node.jsの現在のバージョンは、フラグなしのconst宣言サポートしてい--harmonyます。

上記で、次のように実行できるようnode app.jsになりましたapp.js

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

構文糖とストリクトモードの利点の両方を取得します。


メガバイトMBは10の累乗MiBですが、メビバイトは2の累乗です。ie 1MB = 1e61MiB = 1024 * 1024。ウィキペディアを参照してください。メビバイト
DJDaveMark

0

最近同様の問題があり、このQ&Aに終わりました。これはOPが探していたソリューションではありませんが、同様の問題を抱えている他の人を助ける可能性があります。

PM2を使用してプロジェクトを実行しています。特定のステージングサーバーに、非常に古いバージョンのノード、NPM、およびPM2がありました。私はすべてを更新しましたが、同じエラーを維持し続けました:

SyntaxError:strictモードでのconstの使用。

アプリケーションを数回停止および開始しようとしました。また、すべてをもう一度更新しようとしました。何もうまくいきませんでした。実行したときに警告に気づくまでpm2 start

>>>>インメモリPM2は最新ではありません。次のようにしてください。
>>>> $ pm2 update
インメモリPM2バージョン:0.15.10
ローカルPM2バージョン:3.2.9

ゲッチャ!を実行した後pm2 update、アプリケーションを期待どおりに実行することができました。「const in strict mode」エラーはなくなりました。


-2

constはECMAScriptではサポートされていません。したがって、strictモードを指定すると、構文エラーが発生します。コードにすべてのブラウザーとの互換性を持たせたい場合は、constではなくvarを使用する必要があります。私は知っています、理想的な解決策ではありませんが、それはそれが何であるかです。JavaScriptで読み取り専用プロパティを作成する方法はいくつかありますが(「読み取り専用プロパティは純粋な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
constECMAScriptの6に支持されており、それが広くサポートされています。kangax.github.io/compat-table/es6/#constをしかし、あなたはしているあなたの答えで右- 'use strict';const混合しません。
dotnetCarpenter 2014年

簡単なテストショーconstではなく、オペラ21、クロム35およびFirefox 29でSafariの7で再申告である
dotnetCarpenter

21
ブラウズの互換性は問題ではありません...これはNode.jsです
zamnuts '17年

-2

使用conststrictモードでは、クロム41現在のリリースで利用可能であるクロム41ベータ版はすでにリリースされると、それをサポートしています。


6
明確にするために、OPがNode.jsを要求したため、ブラウザーの互換性は関係がないとコメントしました。しかし、どういうわけか、回答には4つの賛成票があり、他のより関連性の高い回答が不明瞭になりました。
Dan Dascalescu、2015

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

Linuxサーバーの場合
Ayhmi 2017

1
Stack Overflowへようこそ。回答を投稿するときは、コード説明の両方を提供するのが最善です。
O.ジョーンズ

2
説明がないので反対票。naveパッケージをインストールする必要がある理由..
Sean83

なぜそのようなソリューションが機能するのでしょうか?説明が必要です。
ポールイサリス

説明はありませんが、私にとってエラーはここで説明されているコマンドを実行した後にのみ解決されました:npm install -g nave; nave use 6.11.1 +1
Ruben Alves
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.