SyntaxError: Penggunaan const dalam mode ketat

241

Saya bekerja dengan node.js, dan di salah satu file js saya saya gunakan constdi "strict mode". Saat mencoba menjalankannya, saya mendapatkan kesalahan:

SyntaxError: Use of const in strict mode.

Apa praktik terbaik untuk melakukan ini?

Edit:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB
Vivek P
sumber
@thefourtheye check in chrome, ff bekerja dengan baik.
Zaheer Ahmed
gunakan var. Tambahkan semikolon'use strict';
Adrian Preuss
@ZaheerAhmed Sebenarnya saya menggunakan Node.js yaar. Ini berfungsi dengan baik dalam hal itu.
theouroureye
Aah ... Gagal di ideone.com
thefourtheye
Setelah memperbarui versi Node terbaru v5.3.0, itu berfungsi dengan baik sekarang.
zangw

Jawaban:

284

Itu constdan letmerupakan bagian dari ECMAScript 2015 (alias ES6 dan Harmony), dan tidak diaktifkan secara default di Node.js 0.10 atau 0.12. Karena Node.js 4.x, “Semua fitur pengiriman [ES2015], yang dianggap stabil oleh V8, diaktifkan secara default di Node.js dan TIDAK memerlukan jenis bendera runtime.”. Node.js docs memiliki ikhtisar tentang fitur-fitur ES2015 yang diaktifkan secara default, dan yang memerlukan bendera runtime . Jadi dengan memutakhirkan ke Node.js 4.x atau lebih baru kesalahannya akan hilang.

Untuk mengaktifkan beberapa fitur ECMAScript 2015 (termasuk constdan let) di Node.js 0.10 dan 0.12; mulai program simpul Anda dengan tanda harmoni, jika tidak, Anda akan mendapatkan kesalahan sintaksis. Sebagai contoh:

node --harmony app.js

Itu semua tergantung pada sisi mana js ketat Anda berada. Saya akan merekomendasikan menggunakan mode ketat dengan constdeklarasi di sisi server Anda dan mulai server dengan bendera harmoni. Untuk sisi klien, Anda harus menggunakan Babel atau alat serupa untuk mengubah ES2015 menjadi ES5, karena tidak semua browser klien mendukung constdeklarasi.

Alexander
sumber
8
Ini adalah jawaban yang paling lengkap dan relevan.
zamnuts
Mode ketat juga dapat diterapkan menggunakan simpul flag (daripada ekspresi literal) --harmony --use_strict app.js Yang bagus.
Adria
7
Saya ingin saran agar tidak menggunakan flag "use_strict". Itu menjalankan kode orang lain dalam sebuah juru bahasa yang tidak ditulis untuknya. Selalu gunakan 'use strict';diri Anda sendiri, tetapi biarkan kode pihak ketiga memutuskan sendiri.
Thomas Jensen
1
FWIW Saya telah menemukan masalah yang sama menjalankan node v8.1 tetapi versi armfh (raspberry pi).
James
238

Jika ini terjadi di nodejs, itu karena versi yang lebih lama dari nodejs. Perbarui simpul dengan menggunakan,

1) Bersihkan cache NPM:

sudo npm cache clean -f

2) Instal pembantu kecil yang disebut 'n'

sudo npm install -g n

3) Instal versi NodeJS stabil terbaru

sudo n stable

Perbarui instruksi nodejs yang diambil dari, https://stackoverflow.com/a/19584407/698072

Orang asing
sumber
3
Saya mendapatkan "npm ERR! Notsup Tidak didukung npm ERR! Notsup Tidak kompatibel dengan sistem operasi atau arsitektur Anda: [email protected]" ketika mencoba melakukan langkah 2. Waktu yang baik.
VSO
1
Tergantung pada kasus penggunaan Anda, Anda mungkin merasa lebih aman untuk menentukan nodeversi. Misalnya, pada saat penulisan ini, sudo n 6.9.4akan menginstal LTS terbaru, di mana sudo n stableakan menginstal 7.4.0. Jelas, itu adalah perubahan besar, jadi berhati-hatilah n stable. Atau, sudo n ltsinstal LTS terbaru.
jfmercer
1
Bekerja pada centos 6.5. Sebelumnya saya mendapatkan kesalahan berikut "SyntaxError: Use of const dalam mode ketat". Terima kasih
Himanshu Chauhan
1
Ini menyelesaikan masalah bagi saya di mesin lawas tempat bendera --harmony tidak. Pengaturan: Mencoba meluncurkan layar dan mulai monitor menggunakan npm di skrip crontab menyebabkan kesalahan ketat di mana menjalankannya dari cli tidak. Versi node sebelumnya adalah 0.10.48 berjalan di ubuntu 12.04.5 LTS Saya mengikuti langkah ini dan yang mengubah softlink / usr / bin / node dari / etc / alternative / node ke /usr/local/n/versions/node/8.0 .0 / bin / node dan semuanya baru saja bekerja. Terima kasih untuk ini!
Brian Layman
1
Terima kasih Badass untuk ini, itu tidak hanya memecahkan masalah itu tetapi semua kelemahan kecil yang melekat ketika membangun SCA Local
jk121960
22

Biasanya kesalahan ini terjadi ketika versi node yang menjadi kode dieksekusi lebih tua dari yang diharapkan. (yaitu 0,12 atau lebih tua).

jika Anda menggunakan nvm daripada harap pastikan bahwa Anda memiliki versi yang tepat dari node yang digunakan. Anda dapat memeriksa kompatibilitas pada node.green untuk const dalam mode ketat

Saya menemukan masalah serupa pada posting lain dan memposting jawaban saya di sana secara rinci

GG
sumber
1
Saya mengalami ini ketika menjalankan proyek Node saya di WebStorm. Versi lokal saya di repo menjalankan Node 8.2.1, tetapi WebStorm melihat /usr/bin/nodefolder saya , yang memiliki 0.10.46.
Shadoninja
20

Satu langkah penting setelah Anda memperbarui simpul Anda adalah untuk menautkan biner simpul Anda ke versi simpul terinstal terbaru

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  
Shri Shinde
sumber
1
Bagaimana saya mengetahui versi mana yang baru saja diinstal?
Jose Llausas
1
Anda dapat menemukan di mana versi node Anda saat ini diinstal dengan menjalankanwhich node
Steve
Anda juga akan melihat direktori ketika menjalankan "n stable" Pada baris ini: mkdir: /usr/local/n/versions/node/8.0.0 Jadi Anda bisa langsung ke / usr / local / n / versi / node / dan lihat direktori apa yang ada.
Brian Layman
@ JoseLlausas node --versionmencetak nomor versi, mis.v0.10.29
Markus
15

Ini mungkin bukan solusi untuk semua orang, tetapi itu untuk saya.

Jika Anda menggunakan NVM, Anda mungkin belum mengaktifkan versi simpul yang tepat untuk kode yang Anda jalankan. Setelah Anda reboot, versi default node Anda kembali ke standar sistem.

Sedang mengalami ini ketika bekerja dengan reaksi-asli yang telah bekerja dengan baik. Cukup gunakan nvm untuk menggunakan versi simpul yang tepat untuk menyelesaikan masalah ini.

pembuat perahu
sumber
2
dan kode apa saja untuk menggambarkan "solusi" yang Anda nyatakan di atas?
Kermit_ice_tea
ya, ini adalah masalah awal saya. walaupun saya harus beralih ke server linux yang lain karena masalah kompatibilitas versi node dan gcc pada versi centos yang ketinggalan jaman.
Robot70
@Kermit_ice_tea Kode yang sama dalam pertanyaan. Bug ada di versi node, menggunakan NVM untuk mengaturnya ke versi yang tidak memiliki bug yang membuat kode itu lewat. nvm use version-number-you-needyang harus kamu lakukan.
boatcoder
8

Sejak saat pertanyaan diajukan, konsep constkata kunci sudah menjadi standar hidup sebagai bagian dari ECMAScript 2015 . Juga versi Node.js saat ini mendukung deklarasi const tanpa --harmonyflag.

Dengan kata di atas Anda sekarang dapat menjalankan node app.js, dengan app.js:

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

mendapatkan baik sintaksis gula dan manfaat dari mode ketat.

dodev
sumber
Satu megabyte MB adalah kekuatan sepuluh, sedangkan mebibyte MiBadalah kekuatan dua. yaitu 1MB = 1e6dan 1MiB = 1024 * 1024. Lihat wikipedia: Mebibyte
DJDaveMark
0

Saya memiliki masalah serupa baru-baru ini dan berakhir di T&J ini. Ini bukan solusi yang dicari OP tetapi dapat membantu orang lain dengan masalah serupa.

Saya menggunakan PM2 untuk menjalankan proyek dan di server pementasan yang diberikan saya memiliki versi Node, NPM dan PM2 yang sangat lama. Saya memperbarui semuanya, namun saya tetap menyimpan kesalahan yang sama:

SyntaxError: Penggunaan const dalam mode ketat.

Saya mencoba untuk berhenti dan memulai aplikasi beberapa kali. Juga mencoba memperbarui semuanya lagi. Tidak ada yang berhasil. Sampai saya melihat peringatan ketika saya berlari pm2 start:

>>>> PM2 dalam memori kedaluwarsa, lakukan:
>>>> pembaruan $ PM2
Dalam memori versi PM2: 0.15.10
Versi PM2 lokal: 3.2.9

Kena kau! Setelah berjalan pm2 update, saya akhirnya bisa menjalankan aplikasi seperti yang diharapkan. Tidak ada kesalahan "const dalam mode ketat" lagi.

Gustavo Straube
sumber
-2

const tidak didukung oleh ECMAScript. Jadi setelah Anda menentukan mode ketat, Anda mendapatkan kesalahan sintaksis. Anda perlu menggunakan var alih-alih const jika Anda ingin kode Anda kompatibel dengan semua browser. Saya tahu, bukan solusi yang ideal, tetapi ini adalah apa adanya. Ada cara untuk membuat properti hanya baca di JavaScript (lihat Dapatkah Properti Hanya Baca diimplementasikan dalam JavaScript Murni? ) Tapi saya pikir ini mungkin berlebihan tergantung pada skenario Anda.

Di bawah ini adalah catatan kompatibilitas browser dari MDN :

Kompatibilitas browser

Implementasi const saat ini adalah ekstensi khusus Mozilla dan bukan bagian dari ECMAScript 5. Didukung oleh Firefox & Chrome (V8). Pada Safari 5.1.7 dan Opera 12.00, jika Anda mendefinisikan variabel dengan const di browser ini, Anda masih dapat mengubah nilainya nanti. Itu tidak didukung di Internet Explorer 6-10, tetapi termasuk dalam Internet Explorer 11. Kata kunci const saat ini menyatakan konstanta dalam lingkup fungsi (seperti variabel yang dideklarasikan dengan var).

Firefox, setidaknya sejak versi 13, melempar TypeError jika Anda mendeklarasikan ulang konstanta. Tidak ada browser utama yang menghasilkan pemberitahuan atau kesalahan jika Anda menetapkan nilai lain ke sebuah konstanta. Nilai balik dari operasi semacam itu adalah nilai baru yang ditetapkan, tetapi penugasan ulang tidak berhasil hanya di Firefox dan Chrome (setidaknya sejak versi 20).

const akan didefinisikan oleh ECMAScript 6, tetapi dengan semantik yang berbeda. Mirip dengan variabel yang dideklarasikan dengan pernyataan let, konstanta yang dideklarasikan dengan const akan dicekal.

Shital Shah
sumber
3
constdidukung dalam ECMAScript 6 dan didukung secara luas: kangax.github.io/compat-table/es6/#const Tapi Anda benar dalam jawaban Anda - 'use strict';dan consttidak bercampur.
dotnetCarpenter
Tes cepat menunjukkan bahwa constini dapat dideklarasikan ulang di Safari 7 tetapi tidak di Opera 21, Chrome 35 dan Firefox 29.
dotnetCarpenter
21
Kompatibilitas
jelajah
-2

Penggunaan constdalam mode ketat tersedia dengan rilis Chrome 41. Saat ini, Chrome 41 Beta sudah dirilis dan mendukungnya.

morkro
sumber
6
Hanya untuk memperjelas, saya ingin berkomentar bahwa karena OP meminta Node.js, kompatibilitas browser tidak relevan. Namun entah bagaimana jawabannya memiliki 4 upvotes, dan mengaburkan jawaban lain yang lebih relevan.
Dan Dascalescu
-3
cd /
npm install -g nave
nave use 6.11.1
node app.js
Ayhmi
sumber
Untuk server linux
Ayhmi
1
Selamat datang di Stack Overflow. Saat menyumbangkan jawaban, sebaiknya berikan beberapa kode dan penjelasan.
O. Jones
2
Suara turun karena tidak ada penjelasan. mengapa paket nave harus diinstal ..
Sean83
Mengapa solusi seperti itu bekerja? Dibutuhkan penjelasan.
Paul Isaris
Meskipun tidak ada penjelasan, bagi saya kesalahan hanya diselesaikan setelah menjalankan perintah yang dijelaskan di sini: npm install -g nave; nave use 6.11.1 +1
Ruben Alves