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

@thourththeye การตรวจสอบใน chrome, ff ทำงานได้ดี
Zaheer Ahmed

varใช้ เพิ่มเซมิโคลอน'use strict';
Adrian Preuss

@ZaheerAhmed จริงๆแล้วฉันใช้ Node.js yaar มันใช้งานได้ดีในที่
thefourtheye

อ๊ะ ... ล้มเหลวในideone.com
thefourtheye

หลังจากอัพเดตโหนดรุ่นล่าสุด v5.3.0 มันทำงานได้ดีในขณะนี้
zangw

คำตอบ:


284

The constและletเป็นส่วนหนึ่งของ ECMAScript 2015 (aka ES6 และ Harmony) และไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน 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
นี่คือคำตอบที่สมบูรณ์และเกี่ยวข้องที่สุด
zamnuts

โหมดที่เข้มงวดยังสามารถนำไปใช้โดยใช้แฟล็ก (แทนการแสดงออกที่แท้จริง) โหนด --harmony --use_strict app.js ซึ่งเป็นสิ่งที่ดี
Adria

7
ฉันต้องการคำแนะนำไม่ให้ใช้การตั้งค่าสถานะ "use_strict" กำลังเรียกใช้รหัสของคนอื่นในล่ามที่ไม่ได้เขียนไว้ ใช้'use strict';ตัวเองเสมอแต่ให้รหัสบุคคลที่สามตัดสินใจเอง
โทมัสเซ่น

1
FWIW ฉันพบปัญหาเดียวกันกับที่ใช้งานโหนด v8.1 แต่รุ่น armfh (raspberry pi)
James

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 ไม่รองรับ 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 ในโหมดเข้มงวด" ต่อไปนี้ ขอบคุณ
Himanshu Chauhan

1
วิธีนี้แก้ไขปัญหาสำหรับฉันบนเครื่องรุ่นเก่าที่ไม่มีเครื่องหมาย --harmony การติดตั้ง: การพยายามเปิดหน้าจอเริ่มต้น npm โดยใช้สคริปต์ใน crontab ทำให้เกิดข้อผิดพลาดอย่างเข้มงวดที่เรียกใช้จาก cli ไม่ได้ โหนดรุ่นก่อนหน้านี้คือ 0.10.48 ที่รันบน Ubuntu 12.04.5 LTS ฉันได้ทำตามขั้นตอนนี้และหนึ่งการเปลี่ยน softlink / usr / bin / node จาก / etc / ทางเลือก / โหนดเป็น /usr/local/n/versions/node/8.0 .0 / bin / node และทุกอย่างใช้งานได้ ขอบคุณสำหรับสิ่งนี้!
Brian Layman

1
Badass ขอบคุณสำหรับสิ่งนี้มันไม่เพียง แต่แก้ปัญหานั้น แต่สิ่งเล็กน้อยที่
ซ่อนเร้น

22

โดยปกติแล้วข้อผิดพลาดนี้จะเกิดขึ้นเมื่อเวอร์ชันของโหนดที่โค้ดนั้นถูกเรียกใช้นั้นเก่ากว่าที่คาดไว้ (เช่น 0.12 หรือเก่ากว่า)

หากคุณใช้ nvm มากกว่าโปรดตรวจสอบให้แน่ใจว่าคุณใช้โหนดรุ่นที่ถูกต้อง คุณสามารถตรวจสอบความเข้ากันได้กับ node.green สำหรับ const ภายใต้โหมดเข้มงวด

ฉันพบปัญหาที่คล้ายกันในโพสต์อื่นและโพสต์คำตอบของฉันมีรายละเอียด


1
ฉันพบปัญหานี้เมื่อรันโครงการโหนดใน WebStorm เวอร์ชันในเครื่องของฉันใน repo กำลังใช้งาน Node 8.2.1 แต่ WebStorm ดูที่/usr/bin/nodeโฟลเดอร์ของฉันซึ่งมี 0.10.46
Shadoninja

20

หนึ่งขั้นตอนสำคัญหลังจากที่คุณอัปเดตโหนดคือการเชื่อมโยงไบนารี่โหนดของคุณกับเวอร์ชันโหนดที่ติดตั้งล่าสุด

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

1
ฉันจะทราบได้อย่างไรว่าได้ติดตั้งรุ่นใดแล้ว
Jose Llausas

1
คุณสามารถค้นหาตำแหน่งปัจจุบันของโหนดที่ติดตั้งโดยเรียกใช้which node
Steve

นอกจากนี้คุณจะเห็นไดเรกทอรีเมื่อเรียกใช้ "n เสถียร" ในบรรทัดนี้: mkdir: /usr/local/n/versions/node/8.0.0 ดังนั้นคุณสามารถไปที่ / usr / local / n / รุ่น / node / และดูว่ามีไดเรกทอรีใดบ้าง
Brian Layman

@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คือสิ่งที่คุณต้องทำ
boatcoder

8

ตั้งแต่เวลาคำถามที่ถูกถามร่างสำหรับconstคำหลักที่มีอยู่แล้วเป็นมาตรฐานความเป็นอยู่เป็นส่วนหนึ่งของECMAScript 2015 รุ่นปัจจุบันของ Node.js ยังรองรับการประกาศ constโดยไม่ต้อง--harmonyตั้งค่าสถานะ

จากที่กล่าวมาข้างต้นคุณสามารถเรียกใช้node app.jsด้วยapp.js:

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

รับทั้งไวยากรณ์น้ำตาลและประโยชน์ของโหมดเข้มงวด


เมกะไบต์MBคือพลังสิบในขณะที่ mebibyte MiBเป็นพลังของสอง คือและ1MB = 1e6 1MiB = 1024 * 1024ดูวิกิพีเดีย: Mebibyte
DJDaveMark

0

ฉันมีปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้และสิ้นสุดลงในคำถาม & คำตอบนี้ นี่ไม่ใช่วิธีแก้ปัญหาที่ OP ต้องการ แต่อาจช่วยผู้อื่นในปัญหาที่คล้ายกัน

ฉันใช้PM2เพื่อเรียกใช้โครงการและในเซิร์ฟเวอร์ staging ที่กำหนดฉันมี Node, NPM และ PM2 เวอร์ชันเก่ามาก ฉันอัปเดตทุกอย่างแล้ว แต่ฉันยังคงมีข้อผิดพลาดเดิมอยู่:

SyntaxError: การใช้ const ในโหมดเข้มงวด

ฉันพยายามหยุดและเริ่มต้นแอปพลิเคชันหลายครั้ง พยายามอัปเดตทุกอย่างอีกครั้ง ไม่มีอะไรทำงาน จนกระทั่งฉันสังเกตเห็นคำเตือนเมื่อฉันวิ่งpm2 start:

>>>> PM2 ในหน่วยความจำล้าสมัยแล้วทำ:
>>>> $ pm2 update
ในรุ่น PM2 หน่วยความจำ: 0.15.10
Local PM2 version: 3.2.9

Gotcha! ในที่สุดหลังจากทำงานpm2 updateฉันก็สามารถเรียกใช้แอปพลิเคชันได้ตามที่คาดไว้ ไม่มีข้อผิดพลาด "const ในโหมดเข้มงวด" อีกต่อไป


-2

ECMAScript ไม่รองรับ const ดังนั้นหลังจากที่คุณระบุโหมดเข้มงวดคุณจะได้รับข้อผิดพลาดทางไวยากรณ์ คุณต้องใช้ 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 ได้เปิดตัวแล้วและสนับสนุน


6
เพื่อชี้แจงฉันต้องการแสดงความคิดเห็นว่าเนื่องจาก OP ขอ Node.js ความเข้ากันได้ของเบราว์เซอร์จึงไม่เกี่ยวข้อง แต่อย่างใดคำตอบมี upvotes 4 และมันบดบังคำตอบที่เกี่ยวข้องอื่น ๆ เพิ่มเติม
Dan Dascalescu

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

สำหรับเซิร์ฟเวอร์ linux
Ayhmi

1
ยินดีต้อนรับสู่ Stack Overflow เมื่อให้คำตอบควรให้ทั้งรหัสและคำอธิบาย
O. Jones

2
ลงคะแนนเนื่องจากไม่มีคำอธิบาย ทำไมแพคเกจวิหารควรจะติดตั้ง ..
Sean83

เหตุใดโซลูชันดังกล่าวจึงใช้งานได้ ต้องการคำอธิบาย
Paul Isaris

แม้ว่าจะไม่มีคำอธิบายสำหรับฉันข้อผิดพลาดแก้ไขได้หลังจากเรียกใช้คำสั่งที่อธิบายไว้ที่นี่: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.