Składnia Błąd: użycie stałej w trybie ścisłym

241

Pracuję z node.js, aw jednym z moich plików js używam constw "strict mode". Podczas próby uruchomienia pojawia się błąd:

SyntaxError: Use of const in strict mode.

Jaka jest najlepsza praktyka?

Edytować:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB
Vivek P.
źródło
@thefourtheye check in chrome, ff działa dobrze.
Zaheer Ahmed
użyć var. Dodaj semikolon'use strict';
Adrian Preuss
@ZaheerAhmed Właściwie używam yaar Node.js. Działa w tym dobrze.
theourourhehe
Aah ... nie działa
thefourtheye
Po zaktualizowaniu najnowszej wersji węzła wer. 5.3.0 działa teraz dobrze.
zangw

Odpowiedzi:

284

Symbole consti letsą częścią ECMAScript 2015 (alias ES6 i Harmony) i nie były domyślnie włączone w Node.js 0.10 lub 0.12. Od wersji Node.js 4.x „Wszystkie funkcje wysyłki [ES2015], które V8 uważa za stabilne, są domyślnie włączone w Node.js i NIE wymagają żadnych flag wykonawczych.”. Dokumenty Node.js zawierają przegląd tego, które funkcje ES2015 są domyślnie włączone, a które wymagają flagi wykonawczej . Tak więc poprzez aktualizację do Node.js 4.x lub nowszej błąd powinien zniknąć.

Aby włączyć niektóre funkcje ECMAScript 2015 (w tym consti let) w Node.js 0.10 i 0.12; uruchom program węzła z flagą harmonii, w przeciwnym razie pojawi się błąd składni. Na przykład:

node --harmony app.js

Wszystko zależy od tego, po której stronie znajduje się twój ścisły js. Polecam użycie trybu ścisłego z constdeklaracjami po stronie serwera i uruchomienie serwera z flagą harmonii. Po stronie klienta należy użyć Babel lub podobnego narzędzia do konwersji ES2015 na ES5, ponieważ nie wszystkie przeglądarki klienta obsługują constdeklaracje.

Alexander
źródło
8
To jest najbardziej kompletna i odpowiednia odpowiedź.
zamnuts
Tryb ścisły można także zastosować za pomocą węzła flagowego (a nie dosłownego) węzła --harmony --use_strict app.js Co jest miłe.
Adria,
7
Chciałbym odradzać używanie flagi „use_strict”. Obsługuje czyjś kod w tłumaczu, dla którego nie został napisany. Zawsze korzystaj z 'use strict';siebie, ale pozwól, aby kod innej firmy sam decydował.
Thomas Jensen,
1
FWIW Znalazłem ten sam problem z uruchomieniem węzła v8.1, ale w wersji armfh (raspberry pi).
James
238

Jeśli dzieje się tak w nodejs, jest to spowodowane starszą wersją nodejs. Zaktualizuj węzeł za pomocą,

1) Wyczyść pamięć podręczną NPM:

sudo npm cache clean -f

2) Zainstaluj małego pomocnika o nazwie „n”

sudo npm install -g n

3) Zainstaluj najnowszą stabilną wersję NodeJS

sudo n stable

Zaktualizuj instrukcje nodejs zaczerpnięte z: https://stackoverflow.com/a/19584407/698072

Nieznajomy
źródło
3
Otrzymałem ten komunikat „npm ERR! Notsup Nieobsługiwany npm ERR! Notsup Nie jest kompatybilny z twoim systemem operacyjnym lub architekturą: [email protected]” podczas próby wykonania kroku 2. Dobre czasy.
VSO
1
W zależności od przypadku użycia może być bezpieczniej określić nodewersję. Na przykład w momencie pisania tego tekstu sudo n 6.9.4zainstaluje najnowszy LTS, gdzie sudo n stablezostanie zainstalowany 7.4.0. Oczywiście jest to przełomowa zmiana, więc zachowaj ostrożność n stable. Alternatywnie sudo n ltsinstaluje najnowszy LTS.
jfmercer
1
Działa na centos 6.5. Wcześniej pojawiał się następujący błąd „Błąd składni: użycie stałej w trybie ścisłym”. Dzięki
Himanshu Chauhan
1
To rozwiązało problem dla mnie na starszej maszynie, gdzie flaga --harmony nie. Instalacja: Próba uruchomienia ekranu npm start monitor za pomocą skryptów w crontabie spowodowała ścisły błąd w przypadku, gdy nie uruchomił go z cli. Poprzednia wersja węzła to 0.10.48 działająca na Ubuntu 12.04.5 LTS Wykonałem ten krok i zmieniłem softlink / usr / bin / node z / etc / alternatives / node na /usr/local/n/versions/node/8.0 .0 / bin / node i wszystko po prostu działało. Dziękuję Ci za to!
Brian Layman
1
Badass dzięki za to, nie tylko rozwiązał ten problem, ale wszystkie nieodłączne drobiazgi podczas budowania SCA Local
jk121960
22

Zwykle ten błąd występuje, gdy wersja węzła, dla którego wykonywany jest kod, jest starsza niż oczekiwano. (tj. 0,12 lub starszy).

jeśli używasz NVM, upewnij się, że masz odpowiednią wersję używanego węzła. Możesz sprawdzić zgodność na node.green pod kątem const w trybie ścisłym

Znalazłem podobny problem w innym poście i szczegółowo zamieściłem tam swoją odpowiedź

GG
źródło
1
Natknąłem się na to podczas uruchamiania mojego projektu Node w WebStorm. Moja wersja lokalna w repozytorium miała Node 8.2.1, ale WebStorm spojrzał na mój /usr/bin/nodefolder, który miał 0.10.46.
Shadoninja
20

Jednym ważnym krokiem po aktualizacji węzła jest połączenie pliku binarnego węzła z najnowszą zainstalowaną wersją węzła

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  
Shri Shinde
źródło
1
Jak mogę dowiedzieć się, która wersja właśnie została zainstalowana?
Jose Llausas
1
Możesz dowiedzieć się, gdzie zainstalowana jest Twoja bieżąca wersja węzła, uruchamiającwhich node
Steve
Zobaczysz także katalog, gdy uruchomiony jest „n stabilny” W tym wierszu: mkdir: /usr/local/n/versions/node/8.0.0 Więc możesz po prostu przejść do / usr / local / n / version / node / i zobacz, jakie istnieją katalogi.
Brian Layman
@JoseLlausas node --versionwypisuje numer wersji, np.v0.10.29
Markus
15

Prawdopodobnie nie jest to rozwiązanie dla wszystkich, ale było dla mnie.

Jeśli używasz NVM, być może nie włączyłeś odpowiedniej wersji węzła dla uruchomionego kodu. Po ponownym uruchomieniu domyślna wersja węzła zmienia się z powrotem w systemową.

Wpadałem na to podczas pracy z React-Native, które działało dobrze. Wystarczy użyć nvm, aby użyć właściwej wersji węzła, aby rozwiązać ten problem.

Boatcoder
źródło
2
i jakikolwiek kod ilustrujący powyższe „rozwiązanie”?
Kermit_ice_tea
tak, to był mój pierwszy problem. mimo to musiałem przejść na inny serwer linux z powodu problemów ze zgodnością wersji węzła i gcc w nieaktualnej wersji Centos.
Robot70
@Kermit_ice_tea Ten sam kod w pytaniu. Błąd występuje w wersji węzła, przy użyciu NVM ustawia się go na wersję, która nie ma tego błędu, który powoduje przejście tego kodu. nvm use version-number-you-needto wszystko co musisz zrobić.
Boatcoder
8

Od czasu zadania pytania wersja robocza constsłowa kluczowego jest już standardem życia w ramach ECMAScript 2015 . Również bieżąca wersja Node.js obsługuje deklaracje const bez --harmonyflagi.

Mając powyższe, możesz teraz uruchomić node app.js, używając app.js:

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

uzyskanie zarówno cukru składniowego, jak i zalet trybu ścisłego.

dodev
źródło
Megabajt MBto potęga dziesięciu, podczas gdy mebibajt MiBto potęga dwóch. tj . 1MB = 1e6i 1MiB = 1024 * 1024. Zobacz wikipedia: Mebibyte
DJDaveMark
0

Miałem ostatnio podobny problem i skończyłem na tym pytaniu. To nie jest rozwiązanie, którego szukał PO, ale może pomóc innym z podobnym problemem.

Używam PM2 do uruchomienia projektu i na danym serwerze pomostowym miałem naprawdę starą wersję Node, NPM i PM2. Zaktualizowałem wszystko, jednak nadal utrzymywałem ten sam błąd:

Składnia Błąd: użycie stałej w trybie ścisłym.

Kilka razy próbowałem zatrzymać i uruchomić aplikację. Próbowałem także zaktualizować wszystko ponownie. Nic nie działało. Aż zauważyłem ostrzeżenie, gdy biegłem pm2 start:

>>>> In-memory PM2 jest
przeterminowany , wykonaj: >>>> $ pm2 update
W pamięci Wersja PM2: 0.15.10
Lokalna wersja PM2: 3.2.9

Gotcha! Po uruchomieniu w pm2 updatekońcu udało mi się uruchomić aplikację zgodnie z oczekiwaniami. Nie ma już błędów „const w trybie ścisłym”.

Gustavo Straube
źródło
-2

const nie jest obsługiwany przez ECMAScript. Po określeniu trybu ścisłego pojawia się błąd składniowy. Musisz użyć var ​​zamiast const, jeśli chcesz, aby kod był zgodny ze wszystkimi przeglądarkami. Wiem, że nie jest to idealne rozwiązanie, ale takie jest. Istnieją sposoby na tworzenie właściwości tylko do odczytu w JavaScript (patrz Czy właściwości tylko do odczytu można zaimplementować w czystym JavaScript? ), Ale myślę, że może to być nadmierne wykorzystanie w zależności od twojego scenariusza.

Poniżej znajduje się informacja o zgodności przeglądarki z MDN :

Kompatybilność z przeglądarkami

Obecna implementacja const jest rozszerzeniem specyficznym dla Mozilli i nie jest częścią ECMAScript 5. Jest obsługiwana w Firefox i Chrome (V8). Począwszy od Safari 5.1.7 i Opera 12.00, jeśli zdefiniujesz zmienną ze stałą w tych przeglądarkach, możesz nadal zmienić jej wartość później. Nie jest obsługiwany w Internet Explorerze 6-10, ale jest zawarty w Internet Explorerze 11. Słowo kluczowe const obecnie deklaruje stałą w zakresie funkcji (podobnie jak zmienne zadeklarowane przez var).

Firefox, przynajmniej od wersji 13, generuje błąd TypeError, jeśli zmienisz ponownie stałą. Żadna z głównych przeglądarek nie generuje żadnych powiadomień ani błędów, jeśli przypiszesz inną wartość stałej. Zwracana wartość takiej operacji to nowa przypisana wartość, ale ponowne przypisanie kończy się niepowodzeniem tylko w przeglądarce Firefox i Chrome (przynajmniej od wersji 20).

const zostanie zdefiniowany przez ECMAScript 6, ale z inną semantyką. Podobnie jak zmienne zadeklarowane za pomocą instrukcji let, stałe zadeklarowane za pomocą const będą mieć zasięg blokowy.

Shital Shah
źródło
3
constjest obsługiwany w ECMAScript 6 i jest szeroko obsługiwany: kangax.github.io/compat-table/es6/#const Ale masz rację w swojej odpowiedzi - 'use strict';i constnie miesza się.
dotnetCarpenter
Szybki test pokazuje, że constjest ponownie deklarowalny w Safari 7, ale nie w Opera 21, Chrome 35 i Firefox 29.
dotnetCarpenter
21
Kompatybilność przeglądania nie ma znaczenia ... to jest Node.js
zamnuts
-2

Korzystanie z consttrybu ścisłego jest dostępne wraz z wydaniem Chrome 41. Obecnie Chrome 41 Beta jest już wydany i obsługuje go.

morkro
źródło
6
Aby wyjaśnić, chciałem skomentować, że ponieważ OP poprosił o plik Node.js, zgodność przeglądarki nie jest istotna. Jednak w jakiś sposób odpowiedź miała 4 pozytywne głosy i przesłaniała inne, bardziej trafne odpowiedzi.
Dan Dascalescu,
-3
cd /
npm install -g nave
nave use 6.11.1
node app.js
Ayhmi
źródło
Dla serwera linux
Ayhmi
1
Witamy w Stack Overflow. Przy udzielaniu odpowiedzi najlepiej podać zarówno kod, jak i wyjaśnienie.
O. Jones
2
Głosuj w dół, ponieważ nie ma wyjaśnienia. dlaczego należy zainstalować pakiet nave ...
Sean83
Dlaczego takie rozwiązanie miałoby działać? Potrzebne jest wyjaśnienie.
Paul Isaris
Chociaż nie ma wyjaśnienia, dla mnie błąd został rozwiązany dopiero po uruchomieniu opisanych tutaj poleceń: npm install -g nave; nave use 6.11.1 +1
Ruben Alves