ไม่แนะนำให้ใช้“ use เข้มงวด” ใน ES6?


200

ฉันยังไม่คุ้นเคยกับ ECMAScript 6 ฉันเพิ่งโคลน Repo Starter Kit repo ซึ่งใช้ ES6 สำหรับรหัสแอปพลิเคชัน ฉันประหลาดใจที่เห็นว่ามีการกำหนดค่า linter ให้ห้ามการใช้งานuse strictdirective ซึ่งฉันคิดว่าถูกแนะนำในจาวาสคริปต์ก่อน ES6 ดังนั้นประเด็นคืออะไร



คำตอบ:


257

โมดูล ES6 อยู่ในโหมดเข้มงวดเสมอ หากต้องการอ้างอิงส่วนที่เกี่ยวข้องของข้อมูลจำเพาะ :

10.2.1 รหัสโหมดเข้มงวด

หน่วยไวยากรณ์ ECMAScript Script อาจถูกประมวลผลโดยใช้ไวยากรณ์และซีแมนติกของโหมดไม่ จำกัด หรือเข้มงวด รหัสถูกตีความเป็นรหัสโหมดเข้มงวดในสถานการณ์ต่อไปนี้:

  • รหัสสากลเป็นรหัสโหมดเข้มงวดหากเริ่มต้นด้วยคำสั่ง Directive ที่มีการใช้คำสั่งที่เข้มงวด (ดู 14.1.1)
  • รหัสโมดูลเป็นรหัสโหมดเข้มงวดเสมอ
  • ทุกส่วนของ ClassDeclaration หรือ ClassExpression เป็นรหัสโหมดเข้มงวด
  • รหัส Eval เป็นรหัสโหมดเข้มงวดหากเริ่มต้นด้วย Directive Prologue ที่มี Use Strict Directive หรือหากการเรียกใช้ eval เป็น eval โดยตรง (ดู 12.3.4.1) ที่มีอยู่ในรหัสโหมดเข้มงวด
  • รหัสฟังก์ชั่นเป็นรหัสโหมดเข้มงวดหาก FunctionDeclaration, Function Expression, GeneratorDeclaration ที่เกี่ยวข้อง, GeneratorExpression, MethodDefinition หรือ ArrowFunction ที่เกี่ยวข้องมีอยู่ในรหัสโหมดเข้มงวดหรือหากรหัสที่สร้างมูลค่าของฟังก์ชั่นภายใน [[ECMAScriptCode]] เริ่มต้นด้วย Directlog Proode ที่มีการใช้คำสั่งที่เข้มงวด
  • รหัสฟังก์ชั่นที่ให้มาเป็นอาร์กิวเมนต์ของตัวสร้างฟังก์ชั่นและตัวสร้างนั้นเป็นรหัสโหมดที่เข้มงวดหากอาร์กิวเมนต์สุดท้ายคือสตริงที่เมื่อประมวลผลเป็น FunctionBody ที่เริ่มต้นด้วยคำสั่ง Directive ที่มีคำสั่งใช้อย่างเข้มงวด

11
รหัสสากลและรหัสโมดูลแตกต่างกันอย่างไร ฉันคิดว่าฉันเข้าใจผิดเนื่องจากรหัสโมดูลสำหรับฉันหมายถึงทุกสิ่งใน module.js หากฉันต้องการ ('โมดูล')
อาจเคส

8
@BrynnMahsman ES2015 มีโมดูลดั้งเดิม CommonJS เป็นเพียงห้องสมุดและไม่มีอะไรเกี่ยวข้องกับภาษา
Kit Sunde

18
ขอบคุณสำหรับคำตอบของคุณ ดังนั้นจึงไม่ใช่โมดูล ES6 หากไม่ได้ใช้คำหลักนำเข้า / ส่งออก ตอนนี้ฉันกำลังใช้โหนด 4 และฉันไม่สามารถเข้าถึงคำหลักที่นำเข้า / ส่งออกและฉันเพิ่งใช้โมดูล CommonJS.exports และ require () พร้อมกับคุณสมบัติ ES6 ที่เปิดใช้งานโดยค่าเริ่มต้น มันจะอธิบายว่าทำไมฉันต้องใช้เข้มงวดที่ด้านบนของทุกไฟล์ ดังนั้นในทางเทคนิคแล้วฉันยังคงเขียนโมดูล CommonJS ด้วยคุณสมบัติ ES6 บางอย่างที่เปิดใช้งานใน V8?
อาจเคส

7
สำหรับการตรวจสอบอย่างละเอียดว่า "เป็นโมดูลหรือไม่" ดูnczonline.net/blog/2016/04/… "... ในขณะที่การปรากฏตัวของการนำเข้าหรือส่งออกอาจบ่งบอกถึงโมดูลการขาดการนำเข้าหรือส่งออกไม่ได้ระบุอย่างชัดเจนว่าไฟล์ไม่ใช่โมดูลดังนั้นจึงมี ไม่มีวิธีที่มีประสิทธิภาพในการตรวจจับอัตโนมัติว่าไฟล์เป็นโมดูลในระหว่างการวิเคราะห์คำ "
ptim

1
"โมดูล" คืออะไร? ฉันได้รับstrictข้อผิดพลาด (พร้อมตั้งไว้ Airbnb ) "use strict"; console.log('foo')บนสคริปต์ที่ประกอบด้วยคนเดียวของ นั่นคือโมดูลหรือไม่?
Dan Dascalescu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.