Cú pháp: Sử dụng const trong chế độ nghiêm ngặt


241

Tôi đang làm việc với Node.js, và trong một file js của tôi, tôi đang sử dụng consttrong "strict mode". Khi cố chạy nó, tôi gặp lỗi:

SyntaxError: Use of const in strict mode.

Thực hành tốt nhất để làm điều này là gì?

Biên tập:

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

@thefourtheye kiểm tra chrome, ff đang hoạt động tốt.
Zaheer Ahmed

sử dụng var. Thêm semikolon'use strict';
Adrian Preuss

@ZaheerAhmed Thật ra tôi đang sử dụng Node.js yaar. Nó hoạt động tốt trong đó.
thefourtheye

À ... Thất
thefourtheye

Sau khi cập nhật phiên bản Node mới nhất v5.3.0, giờ đây nó hoạt động tốt.
zangw

Câu trả lời:


284

Các constletlà một phần của ECMAScript 2015 (aka ES6 và Harmony), và đã không được kích hoạt theo mặc định trong Node.js 0,10 hoặc 0,12. Vì các tính năng của Node.js 4.x, tất cả vận chuyển [ES2015], mà V8 coi là ổn định, được bật theo mặc định trên Node.js và KHÔNG yêu cầu bất kỳ loại cờ thời gian chạy nào. Các tài liệu Node.js có một cái nhìn tổng quan về các tính năng ES2015 được bật theo mặc định và những người yêu cầu cờ thời gian chạy . Vì vậy, bằng cách nâng cấp lên Node.js 4.x hoặc mới hơn, lỗi sẽ biến mất.

Để bật một số tính năng ECMAScript 2015 (bao gồm constlet) trong Node.js 0.10 và 0.12; bắt đầu chương trình nút của bạn với một cờ hài hòa, nếu không bạn sẽ gặp lỗi cú pháp. Ví dụ:

node --harmony app.js

Tất cả phụ thuộc vào phía js nghiêm ngặt của bạn được đặt. Tôi sẽ khuyên bạn nên sử dụng chế độ nghiêm ngặt với các constkhai báo ở phía máy chủ của bạn và khởi động máy chủ với cờ hài hòa. Đối với phía khách hàng, bạn nên sử dụng Babel hoặc công cụ tương tự để chuyển đổi ES2015 sang ES5, vì không phải tất cả các trình duyệt máy khách đều hỗ trợ constkhai báo.


8
Đây là câu trả lời đầy đủ và phù hợp nhất.
zamnuts

Chế độ nghiêm ngặt cũng có thể được áp dụng bằng cách sử dụng nút cờ (chứ không phải biểu thức bằng chữ) --harmony --use_strict app.js.
Adria

7
Tôi muốn khuyên bạn không nên sử dụng cờ "use_strict". Nó đang chạy mã của người khác trong một trình thông dịch mà nó không được viết cho. Luôn luôn sử dụng 'use strict';chính mình, nhưng hãy để mã bên thứ ba tự quyết định.
Thomas Jensen

1
FWIW Tôi đã tìm thấy cùng một vấn đề khi chạy nút v8.1 nhưng phiên bản armfh (raspberry pi).
James

238

Nếu điều này xảy ra trong nodejs, thì đó là do phiên bản cũ hơn của nodejs. Cập nhật nút bằng cách sử dụng,

1) Xóa bộ nhớ cache của NPM:

sudo npm cache clean -f

2) Cài đặt một trình trợ giúp nhỏ gọi là 'n'

sudo npm install -g n

3) Cài đặt phiên bản NodeJS ổn định mới nhất

sudo n stable

Cập nhật hướng dẫn của nodejs được lấy từ, https://stackoverflow.com/a/19584407/698072


3
Tôi đã nhận được "npm ERR! Notsup Không được hỗ trợ npm ERR! Notsup Không tương thích với hệ điều hành hoặc kiến ​​trúc của bạn: n@2.1.4" trong khi cố gắng thực hiện bước 2. Thời gian tốt.
VSO

1
Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể thấy an toàn hơn khi chỉ định nodephiên bản. Ví dụ, tại thời điểm viết bài này, sudo n 6.9.4sẽ cài đặt LTS mới nhất, nơi sudo n stablesẽ cài đặt 7.4.0. Rõ ràng, đó là một sự thay đổi đột phá, vì vậy hãy cẩn thận n stable. Ngoài ra, sudo n ltscài đặt LTS gần đây nhất.
jfmercer

1
Hoạt động trên centos 6.5. Trước đó tôi đã nhận được lỗi sau "SyntaxError: Sử dụng const trong chế độ nghiêm ngặt". Cảm ơn
Himanshu Chauhan

1
Điều này đã giải quyết vấn đề cho tôi trên một máy kế thừa mà cờ --harmony không có. Thiết lập: Việc cố gắng khởi chạy màn hình khởi động màn hình npm bằng các tập lệnh trong crontab đã gây ra lỗi nghiêm trọng khi chạy nó từ cli. Phiên bản nút trước đó là 0.10.48 đang chạy trên Ubuntu 12.04.5 LTS Tôi đã làm theo bước này và một thay đổi liên kết mềm / usr / bin / nút từ / etc / thay thế / nút thành /usr/local/n/versions/node/8.0 .0 / bin / nút và mọi thứ chỉ hoạt động. Cảm ơn vì điều này!
Brian Layman

1
Badass cảm ơn vì điều này, nó không chỉ giải quyết vấn đề đó mà tất cả các yếu tố nhỏ bé vốn có khi xây dựng SCA Local
jk121960

22

Thông thường lỗi này xảy ra khi phiên bản của nút mà mã đang được thực thi cũ hơn dự kiến. (tức là 0,12 trở lên).

nếu bạn đang sử dụng nvm hơn, vui lòng đảm bảo rằng bạn có phiên bản nút được sử dụng đúng. Bạn có thể kiểm tra tính tương thích trên node.green cho const trong chế độ nghiêm ngặt

Tôi tìm thấy một vấn đề tương tự trên một bài đăng khác và đăng chi tiết câu trả lời của tôi ở đó


1
Tôi gặp phải điều này khi chạy dự án Node của mình trong WebStorm. Phiên bản địa phương của tôi trong repo đã chạy Node 8.2.1, nhưng /usr/bin/nodeWebStorm đã xem thư mục của tôi , có 0.10.46.
Shadoninja

20

Một bước quan trọng sau khi bạn cập nhật nút của mình là liên kết nhị phân nút của bạn với phiên bản nút được cài đặt mới nhất

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

1
Làm thế nào tôi có thể tìm ra phiên bản nào vừa được cài đặt?
Jose Llausas

1
Bạn có thể tìm thấy nơi cài đặt phiên bản nút hiện tại của mình bằng cách chạywhich node
Steve

Ngoài ra, bạn sẽ thấy thư mục khi chạy "n ổn định" Trong dòng này: mkdir: /usr/local/n/versions/node/8.0.0 Vì vậy, bạn có thể chỉ cần truy cập / usr / local / n / Phiên bản / nút / và xem những thư mục tồn tại.
Brian Layman

@JoseLlausas node --versionin ra số phiên bản, vdv0.10.29
Markus

15

Đây có lẽ không phải là giải pháp cho tất cả mọi người, nhưng nó là dành cho tôi.

Nếu bạn đang sử dụng NVM, bạn có thể không kích hoạt đúng phiên bản nút cho mã bạn đang chạy. Sau khi bạn khởi động lại, phiên bản nút mặc định của bạn sẽ thay đổi trở lại mặc định của hệ thống.

Đã gặp phải vấn đề này khi làm việc với Reac -igen đã hoạt động tốt. Chỉ cần sử dụng nvm để sử dụng đúng phiên bản của nút để giải quyết vấn đề này.


2
và bất kỳ mã nào để minh họa "giải pháp" đã nêu của bạn ở trên?
Kermit_ice_tea

vâng, đây là vấn đề ban đầu của tôi mặc dù tôi đã phải chuyển sang một máy chủ linux khác do các vấn đề tương thích phiên bản nút và gcc trên một phiên bản centos lỗi thời.
Robot70

@Kermit_ice_tea Mã tương tự trong câu hỏi. Lỗi nằm ở phiên bản của nút, sử dụng NVM để đặt nó thành phiên bản không có lỗi đó khiến mã đó vượt qua. nvm use version-number-you-needlà tất cả những gì bạn phải làm
thuyền viên

8

Kể từ thời điểm câu hỏi được đặt ra, bản nháp cho consttừ khóa đã là một tiêu chuẩn sống như một phần của ECMAScript 2015 . Ngoài ra, phiên bản hiện tại của Node.js hỗ trợ khai báo const mà không cần--harmony cờ.

Với những điều đã nói ở trên, bây giờ bạn có thể chạy node app.js, với app.js:

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

nhận được cả cú pháp đường và lợi ích của chế độ nghiêm ngặt.


Một megabyte MBlà sức mạnh của mười, trong khi một mebibyte MiBlà sức mạnh của hai. tức là 1MB = 1e61MiB = 1024 * 1024. Xem wikipedia: Mebibyte
DJDaveMark

0

Tôi đã có một vấn đề tương tự gần đây và kết thúc trong phần hỏi đáp này. Đây không phải là giải pháp mà OP đang tìm kiếm nhưng có thể giúp đỡ những người khác có vấn đề tương tự.

Tôi đang sử dụng PM2 để chạy một dự án và trong một máy chủ dàn dựng nhất định, tôi đã có một phiên bản Node, NPM và PM2 thực sự cũ. Tôi đã cập nhật mọi thứ, tuy nhiên, tôi vẫn giữ cùng một lỗi:

Cú pháp: Sử dụng const trong chế độ nghiêm ngặt.

Tôi đã cố gắng dừng lại và bắt đầu ứng dụng nhiều lần. Cũng cố gắng cập nhật mọi thứ một lần nữa. Không có gì làm việc. Cho đến khi tôi nhận thấy một cảnh báo khi tôi chạy pm2 start:

>>>> PM2 trong bộ nhớ đã hết hạn, hãy làm:
>>>> Cập nhật $ pm2
Trong bộ nhớ Phiên bản PM2: 0.15.10
Phiên bản PM2 cục bộ: 3.2.9

Gotcha! Sau khi chạy pm2 update, cuối cùng tôi đã có thể khiến ứng dụng chạy như mong đợi. Không còn lỗi "const trong chế độ nghiêm ngặt" nữa.


-2

const không được hỗ trợ bởi ECMAScript. Vì vậy, sau khi bạn chỉ định chế độ nghiêm ngặt, bạn nhận được lỗi cú pháp. Bạn cần sử dụng var thay vì const nếu bạn muốn mã của mình tương thích với tất cả các trình duyệt. Tôi biết, không phải là giải pháp lý tưởng, nhưng nó là những gì nó được. Có nhiều cách để tạo các thuộc tính chỉ đọc trong JavaScript (xem Các thuộc tính chỉ đọc có thể được triển khai trong JavaScript thuần không? ) Nhưng tôi nghĩ rằng nó có thể quá mức tùy thuộc vào kịch bản của bạn.

Dưới đây là ghi chú tương thích trình duyệt từ MDN :

Tính tương thích của trình duyệt web

Việc triển khai const hiện tại là một tiện ích mở rộng dành riêng cho Mozilla và không phải là một phần của ECMAScript 5. Nó được hỗ trợ trong Firefox & Chrome (V8). Kể từ Safari 5.1.7 và Opera 12.00, nếu bạn xác định một biến có const trong các trình duyệt này, bạn vẫn có thể thay đổi giá trị của nó sau này. Nó không được hỗ trợ trong Internet Explorer 6-10, nhưng được bao gồm trong Internet Explorer 11. Từ khóa const hiện khai báo hằng số trong phạm vi hàm (như các biến được khai báo với var).

Firefox, ít nhất là từ phiên bản 13, ném TypeError nếu bạn tái định nghĩa một hằng số. Không có trình duyệt chính nào tạo ra bất kỳ thông báo hoặc lỗi nào nếu bạn gán giá trị khác cho hằng số. Giá trị trả về của một thao tác như vậy là giá trị mới được chỉ định, nhưng việc gán lại chỉ không thành công trong Firefox và Chrome (ít nhất là từ phiên bản 20).

const sẽ được định nghĩa bởi ECMAScript 6, nhưng với các ngữ nghĩa khác nhau. Tương tự như các biến được khai báo bằng câu lệnh let, các hằng số được khai báo với const sẽ nằm trong phạm vi khối.


3
constđược hỗ trợ trong ECMAScript 6 và nó được hỗ trợ rộng rãi: kangax.github.io/compat-table/es6/#const Nhưng bạn đã trả lời đúng - 'use strict';constkhông trộn lẫn.
dotnetCarpenter

Một thử nghiệm nhanh cho thấy có thể khai báo constlại trong Safari 7 nhưng không có trong Opera 21, Chrome 35 và Firefox 29.
dotnetCarpenter

21
Khả năng tương thích duyệt không có gì đáng lo ngại ... đây là Node.js
zamnuts

-2

Việc sử dụng constở chế độ nghiêm ngặt có sẵn khi phát hành Chrome 41. Hiện tại, Chrome 41 Beta đã được phát hành và hỗ trợ nó.


6
Để làm rõ, tôi muốn nhận xét rằng vì OP đã yêu cầu Node.js, khả năng tương thích trình duyệt không liên quan. Tuy nhiên, bằng cách nào đó, câu trả lời có 4 câu trả lời, và nó che khuất các câu trả lời khác có liên quan hơn.
Dan Dascalescu

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

Đối với máy chủ linux
Ayhmi

1
Chào mừng bạn đến với Stack Overflow. Khi đóng góp câu trả lời, tốt nhất là cung cấp cả mã giải thích.
O. Jones

2
Bỏ phiếu vì không có lời giải thích. tại sao nên cài đặt gói nave ..
Sean83

Tại sao một giải pháp như vậy sẽ làm việc? Một lời giải thích là cần thiết.
Paul Isaris

Mặc dù không có lời giải thích, nhưng đối với tôi, lỗi chỉ được giải quyết sau khi chạy các lệnh được mô tả ở đây: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.