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 в хромі, ff працює нормально.
Захер Ахмед

використання var. Додати semikolon'use strict';
Адріан

@ZaheerAhmed Насправді я використовую Node.js yaar. Це чудово працює в цьому.
thefourtheye

Ааа ... Збій в ideone.com
thefourtheye

Після оновлення останньої версії Node v5.3.0 вона працює добре.
zangw

Відповіді:


284

constІ letє частиною ECMAScript 2015 (він же ES6 і гармонії), і не була включена за замовчуванням в Node.js 0,10 або 0,12. Оскільки Node.js 4.x, "усі функції доставки [ES2015], які V8 вважає стабільними, увімкнено на Node.js за замовчуванням і не потребують будь-якого прапора часу виконання." Документи Node.js містять огляд того, які функції ES2015 включені за замовчуванням, а також яким потрібен прапор часу виконання . Отже, оновивши до Node.js 4.x або новішу, помилка повинна зникнути.

Увімкнути деякі функції ECMAScript 2015 (включаючи constта let) у Node.js 0.10 та 0,12; запустіть свою вузлову програму зі знаком гармонії, інакше ви отримаєте синтаксичну помилку. Наприклад:

node --harmony app.js

Все залежить від того, на якій стороні знаходиться ваш суворий js. Я рекомендую використовувати суворий режим з constдеклараціями на стороні вашого сервера і запускати сервер зі знаком гармонії. Для клієнтської сторони вам слід використовувати Babel або подібний інструмент для перетворення ES2015 в ES5, оскільки не всі клієнтські браузери підтримують constдекларації.


8
Це найбільш повна і відповідна відповідь.
замнуть

Строгий режим також може застосовуватися за допомогою прапора (а не буквального виразу) вузла --гармонія --use_strict app.js Що приємно.
Адрія

7
Я хотів би порадити щодо використання прапора "use_strict". Він працює за чужим кодом в інтерпретаторі, для якого він не був написаний. Завжди використовуйте 'use strict';себе, але нехай сторонній код вирішує сам.
Томас Дженсен

1
FWIW Я знайшов той самий випуск, що працює під вузлом v8.1, але версія armfh (малиновий пі).
Джеймс

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


3
Я отримав це "npm ERR! Notsup Непідтримуваний npm ERR! Notsup Не сумісний з вашою операційною системою або архітектурою: n@2.1.4", намагаючись зробити крок 2. Добрі часи.
VSO

1
Залежно від вашого випадку використання, вам може бути безпечніше вказати nodeверсію. Наприклад, станом на час написання цього документа sudo n 6.9.4буде встановлено останню LTS, де sudo n stableбуде встановлено 7.4.0. Очевидно, що це надзвичайна зміна, тому будьте обережні n stable. Крім того, sudo n ltsвстановлюється найсвіжіший LTS.
jfmercer

1
Працює на центос 6.5. Раніше я отримував таку помилку "SyntaxError: Використання const у суворому режимі". Спасибі
Хіманшу Чаухан

1
Це вирішило для мене це питання на застарілій машині, де прапор --гармонії не було. Налаштування: Спроба запустити монітор запуску екрана npm за допомогою скриптів у crontab викликала сувору помилку, коли запуск його із кліпу не робив. Попередня версія вузла була 0.10.48, що працює на ubuntu 12.04.5 LTS. Я дотримувався цього кроку, і той, хто змінив softlink / usr / bin / node з / etc / alternative / node на /usr/local/n/versions/node/8.0 .0 / bin / node та все, що тільки працювало. Дякую за це!
Брайан Лейман

1
Badass спасибі за це, вона не тільки вирішила цю проблему, але і всі притаманні їй невеликі уявлення під час створення SCA Local
jk121960

22

Зазвичай ця помилка виникає, коли версія вузла, проти якого виконується код, є старшою, ніж очікувалося. (тобто 0,12 або більше).

якщо ви використовуєте nvm, тоді переконайтеся, що ви використовуєте правильну версію вузла. Ви можете перевірити сумісність на node.green на предмет const в суворому режимі

Я знайшов подібне питання на іншій посаді і детально розмістив там свою відповідь


1
Я зіткнувся з цим під час запуску свого проекту Node в WebStorm. У моїй локальній версії репо працював Node 8.2.1, але WebStorm подивився на мою /usr/bin/nodeпапку, в якій було 0.10.46.
Шадоніня

20

Одним з важливих кроків після оновлення вашого вузла є підключення вашого бінарного вузла до останньої встановленої версії вузла

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

1
Як я можу зрозуміти, яку версію щойно встановили?
Хосе Льоусас

1
Ви можете знайти, де встановлена ​​ваша поточна версія вузла, запустившиwhich node
Стів

Також ви побачили каталог під час запуску "n stable". У цьому рядку: mkdir: /usr/local/n/versions/node/8.0.0. Ви можете просто перейти до / usr / local / n / version / node / і подивіться, які каталоги існують.
Брайан Лейман

@JoseLlausas node --versionвидає номер версії, наприкладv0.10.29
Markus

15

Мабуть, це рішення не для всіх, але це було для мене.

Якщо ви використовуєте NVM, можливо, ви не включили правильну версію вузла для запущеного коду. Після перезавантаження ваша версія за замовчуванням версія вузла повертається до системної за замовчуванням.

Натрапляв на це під час роботи з рідними реакторами, які добре працювали. Для вирішення цієї проблеми просто використовуйте nvm, щоб використовувати правильну версію вузла.


2
і будь-який код, який ілюструє вказане вище "рішення"?
Kermit_ice_tea

так, це було моїм початковим питанням. хоча мені довелося все-таки перейти на інший сервер Linux через проблеми сумісності версій з вузлом та gcc у застарілій версії centos.
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- це потужність десяти, тоді як мебібайт MiB- потужність двох. тобто 1MB = 1e6і 1MiB = 1024 * 1024. Дивіться вікіпедію: Мебібайт
DJDaveMark

0

У мене був подібний випуск нещодавно і закінчився цим запитанням. Це не рішення, яке шукала ОП, але може допомогти іншим у подібному питанні.

Я використовую PM2 для запуску проекту, і на даному сервері постановки у мене була дійсно стара версія Node, NPM та PM2. Я все оновив, однак я продовжував зберігати ту саму помилку:

SyntaxError: використання const у суворому режимі.

Я кілька разів намагався зупинити і запустити додаток. Також спробували оновити все заново. Нічого не працювало. Поки я не помітив попередження, коли бігав pm2 start:

>>>> PM2 в пам'яті застарілий, зробіть:
>>>> Оновлення $ pm2
У пам'яті версія PM2: 0.15.10
Місцева версія PM2: 3.2.9

Отримав! Після запуску pm2 updateя нарешті зміг запустити програму, як очікувалося. Більше жодних помилок "const у строгому режимі".


-2

const не підтримується ECMAScript. Тож після введення строгого режиму ви отримуєте синтаксичну помилку. Вам потрібно використовувати var замість const, якщо ви хочете, щоб ваш код був сумісний з усіма браузерами. Я знаю, не ідеальне рішення, але воно є. Існують способи створення властивостей лише для читання в 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
constпідтримується в ECMAScript 6, і він широко підтримується: kangax.github.io/compat-table/es6/#const Але ви правий у своїй відповіді - 'use strict';і constне змішується.
dotnetCarpenter

Швидкий тест показує, що його constможна повторно заявити в Safari 7, але не в Opera 21, Chrome 35 та Firefox 29.
dotnetCarpenter

21
Сумісність перегляду не викликає жодних проблем ... це Node.js
zamnuts

-2

Використання constв суворому режимі доступне з випуском Chrome 41. В даний час Chrome 41 Beta вже випущений і підтримує його.


6
Просто для уточнення, я хотів прокоментувати, що оскільки ОП просила Node.js, сумісність браузера не має значення. І все-таки якимось чином відповідь мала 4 оновлення, і це затьмарило інші більш відповідні відповіді.
Дан Даскалеску

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

Для сервера Linux
Айхмі

1
Ласкаво просимо до переповнення стека. Надаючи відповідь, найкраще надати обом якийсь код і пояснення.
О. Джонс

2
Відмовились від голосування, оскільки немає пояснень. чому слід встановити неф-пакет ..
Sean83

Чому таке рішення спрацювало б? Потрібно пояснення.
Пол Ізаріс

Хоча пояснення немає, для мене помилка була вирішена лише після запуску описаних тут команд: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.