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. Добавить семиколон'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
Это самый полный и актуальный ответ.
Замнюц
Строгий режим также может применяться с использованием узла флага (а не буквального выражения) --harmony --use_strict app.js.
Адрия
7
Я хотел бы посоветовать вам не использовать флаг use_strict. Он запускает чужой код в интерпретаторе, для которого он не был написан. Всегда используйте 'use strict';себя, но пусть сторонний код решает сам.
Томас Дженсен
1
Я обнаружил ту же проблему с узлом 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

Обновите инструкции nodejs, взятые с https://stackoverflow.com/a/19584407/698072

Незнакомец
источник
3
Я получил это «npm ERR! Notsup Unsupported 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
Работает на Centos 6.5. Ранее я получал следующую ошибку "SyntaxError: Использование const в строгом режиме". Спасибо
Химаншу Чаухан
1
Это решило проблему для меня на устаревшей машине, где нет флага --harmony. Установка: Попытка запустить экран npm start monitor с использованием скриптов в crontab вызвала строгую ошибку, при которой запуск его из клима не выполнялся. Предыдущая версия узла была 0.10.48, работала в Ubuntu 12.04.5 LTS Я следовал этому шагу, и тот изменил softlink / usr / bin / node с / etc / alternatives / node на /usr/local/n/versions/node/8.0 .0 / bin / node и все просто работает. Спасибо тебе за это!
Брайан Лэйман
1
За это спасибо Badass, она не только решила эту проблему, но и все присущие ей слабые места при сборке SCA Local
jk121960
22

Обычно эта ошибка возникает, когда версия узла, для которого выполняется код, старше, чем ожидалось. (т.е. 0,12 или старше).

если вы используете nvm, убедитесь, что у вас правильная версия используемого узла. Вы можете проверить совместимость на node.green для const в строгом режиме.

Я нашел похожую проблему в другом посте и опубликовал свой ответ там подробно

GG
источник
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
Steve
Также вы увидите каталог при запуске "n stable". В этой строке: mkdir: /usr/local/n/versions/node/8.0.0, поэтому вы можете просто перейти в / usr / local / n / version / node / и посмотрите, какие каталоги существуют.
Брайан Лейман
@JoseLlausas node --versionраспечатывает номер версии, напримерv0.10.29
Маркус
15

Это, вероятно, не решение для всех, но это было для меня.

Если вы используете NVM, возможно, вы не включили правильную версию узла для кода, который вы запускаете. После перезагрузки версия вашего узла по умолчанию изменится на системную по умолчанию.

Работал с этим при работе с Reaction-native, который работал нормально. Просто используйте nvm, чтобы использовать правильную версию узла для решения этой проблемы.

boatcoder
источник
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;
...

получить как синтаксический сахар, так и преимущества строгого режима.

dodev
источник
Мегабайт MB- это степень десяти, а мегабайт - это степень MiBдвух. т.е. 1MB = 1e6и 1MiB = 1024 * 1024. Смотрите википедию: Mebibyte
DJDaveMark
0

У меня недавно была похожая проблема, и я попал в вопросы и ответы. Это не решение, которое ищет ОП, но может помочь другим с подобной проблемой.

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

SyntaxError: использование const в строгом режиме.

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

>>>> PM2 в памяти устарел, выполните:
>>>> $ pm2 update
В памяти версия PM2: 0.15.10
Локальная версия PM2: 3.2.9

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

Густаво Штраубе
источник
-2

const не поддерживается ECMAScript. Поэтому после указания строгого режима вы получите синтаксическую ошибку. Вам нужно использовать 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
Быстрый тест показывает, что его constможно повторно декларировать в Safari 7, но не в Opera 21, Chrome 35 и Firefox 29.
dotnetCarpenter
21
Совместимость просмотра не имеет значения ... это Node.js
zamnuts
-2

Использование constв строгом режиме доступно с выпуском Chrome 41. В настоящее время Chrome 41 Beta уже выпущен и поддерживает его.

morkro
источник
6
Просто чтобы уточнить, я хотел бы прокомментировать, что, поскольку ОП запросил Node.js, совместимость браузера не имеет значения. Тем не менее, так или иначе ответ имел 4 ответа, и это затенило другие более важные ответы.
Дан Даскалеску
-3
cd /
npm install -g nave
nave use 6.11.1
node app.js
Ayhmi
источник
Для сервера Linux
Ayhmi
1
Добро пожаловать в переполнение стека. Когда вы предоставляете ответ, лучше всего дать код и пояснение.
О. Джонс
2
Вниз голосование, потому что нет никаких объяснений. почему неф пакет должен быть установлен ..
Sean83
Почему такое решение будет работать? Требуется объяснение.
Пол Исарис
Хотя объяснений нет, для меня ошибка решена только после запуска описанных здесь команд: npm install -g nave; nave use 6.11.1 +1
Рубен Алвес