การใช้'use strict';
ไม่ได้ทำให้โค้ดของคุณดีขึ้นในทันที
โหมด JavaScript เข้มงวดเป็นคุณลักษณะในECMAScript 5 คุณสามารถเปิดใช้งานโหมดเข้มงวดโดยการประกาศสิ่งนี้ที่ด้านบนของสคริปต์ / ฟังก์ชั่นของคุณ
'use strict';
เมื่อเอ็นจิ้น JavaScript มองเห็นคำสั่งนี้มันจะเริ่มตีความรหัสในโหมดพิเศษ ในโหมดนี้ข้อผิดพลาดจะถูกโยนออกมาเมื่อมีการตรวจพบวิธีการเข้ารหัสที่อาจทำให้เกิดข้อบกพร่องที่อาจเกิดขึ้นได้ (ซึ่งเป็นเหตุผลที่อยู่เบื้องหลังโหมดเข้มงวด)
ลองพิจารณาตัวอย่างนี้:
var a = 365;
var b = 030;
ในความหลงใหลของพวกเขาในการเรียงตัวอักษรตัวเลขผู้พัฒนาได้เริ่มต้นตัวแปรโดยไม่ได้ตั้งใจb
กับตัวอักษรแปด โหมดที่ไม่เข้มงวดจะตีความว่านี่เป็นตัวอักษรตัวเลขที่มีค่า24
(ในฐาน 10) อย่างไรก็ตามโหมดเข้มงวดจะส่งข้อผิดพลาด
สำหรับรายการพิเศษที่ไม่ครบถ้วนสมบูรณ์ในโหมดเข้มงวดดูคำตอบนี้
ฉันควรใช้'use strict';
ที่ไหน
ในแอปพลิเคชัน JavaScript ใหม่ของฉัน: แน่นอน! โหมดเข้มงวดสามารถใช้เป็นผู้แจ้งเบาะแสเมื่อคุณกำลังทำอะไรโง่ ๆ ด้วยรหัสของคุณ
ในรหัส JavaScript ที่มีอยู่ของฉัน: อาจไม่! หากรหัส JavaScript ปัจจุบันของคุณมีข้อความที่ห้ามใช้ในโหมดเข้มงวดแอปพลิเคชันจะหยุดทำงาน หากคุณต้องการโหมดเข้มงวดคุณควรเตรียมพร้อมที่จะทำการดีบั๊กและแก้ไขรหัสที่มีอยู่ของคุณ นี่คือสาเหตุที่การใช้'use strict';
ไม่ได้ทำให้โค้ดของคุณดีขึ้นในทันที
ฉันจะใช้โหมดเข้มงวดได้อย่างไร
แทรก'use strict';
คำสั่งที่ด้านบนของสคริปต์ของคุณ:
// File: myscript.js
'use strict';
var a = 2;
....
โปรดทราบว่าทุกอย่างในไฟล์myscript.js
จะถูกตีความในโหมดเข้มงวด
หรือแทรก'use strict';
คำสั่งที่ด้านบนของตัวฟังก์ชันของคุณ:
function doSomething() {
'use strict';
...
}
ทุกอย่างในขอบเขตของฟังก์ชันdoSomething
จะถูกตีความในโหมดเข้มงวด คำศัพท์ขอบเขตที่สำคัญที่นี่ ตัวอย่างเช่นหากรหัสที่เข้มงวดของคุณเรียกใช้ฟังก์ชันของไลบรารีที่ไม่เข้มงวดเฉพาะรหัสของคุณเท่านั้นที่จะถูกดำเนินการในโหมดเข้มงวดและไม่ใช่ฟังก์ชั่นที่เรียกว่า ดูคำตอบนี้สำหรับคำอธิบายที่ดีกว่า
สิ่งใดบ้างที่ห้ามใช้ในโหมดเข้มงวด
ฉันพบบทความที่ดีที่อธิบายสิ่งต่าง ๆ ที่ต้องห้ามในโหมดเข้มงวด (โปรดทราบว่านี่ไม่ใช่รายการพิเศษ):
ขอบเขต
ในอดีต JavaScript ได้สับสนเกี่ยวกับวิธีการกำหนดขอบเขต บางครั้งพวกเขาดูเหมือนจะถูกกำหนดขอบเขตแบบคงที่ แต่คุณสมบัติบางอย่างทำให้พวกเขาทำงานเหมือนพวกเขาจะถูกกำหนดขอบเขตแบบไดนามิก สิ่งนี้ทำให้เกิดความสับสนทำให้โปรแกรมอ่านและเข้าใจยาก ความเข้าใจผิดทำให้เกิดข้อบกพร่อง มันเป็นปัญหาสำหรับประสิทธิภาพ การกำหนดขอบเขตแบบคงที่จะอนุญาตให้การรวมตัวแปรเกิดขึ้นในเวลารวบรวม แต่ข้อกำหนดสำหรับขอบเขตแบบไดนามิกหมายถึงการรวมจะต้องถูกเลื่อนออกไปถึงรันไทม์ซึ่งมาพร้อมกับการลงโทษประสิทธิภาพที่สำคัญ
โหมดเข้มงวดต้องการให้การเชื่อมตัวแปรทั้งหมดทำแบบสแตติก นั่นหมายความว่าฟีเจอร์ที่ต้องการการเชื่อมโยงแบบไดนามิกก่อนหน้านี้จะต้องถูกกำจัดหรือแก้ไข โดยเฉพาะอย่างยิ่งคำสั่ง with จะถูกกำจัดออกไปและความสามารถของฟังก์ชั่น eval ในการแก้ไขสภาพแวดล้อมของผู้โทรจะถูก จำกัด อย่างรุนแรง
ข้อดีอย่างหนึ่งของรหัสที่เข้มงวดคือเครื่องมือเช่นYUI Compressor
สามารถทำงานได้ดีขึ้นเมื่อทำการประมวลผล
ตัวแปรโกลบอลโดยนัย
JavaScript มีตัวแปรทั่วโลกโดยนัย หากคุณไม่ได้ประกาศตัวแปรอย่างชัดเจนตัวแปรโกลบอลจะถูกประกาศให้คุณโดยปริยาย ทำให้การเขียนโปรแกรมง่ายขึ้นสำหรับผู้เริ่มต้นเนื่องจากพวกเขาสามารถละเลยงานบ้านขั้นพื้นฐานบางอย่างได้ แต่มันทำให้การจัดการโปรแกรมขนาดใหญ่ยากขึ้นและลดความน่าเชื่อถือลงอย่างมาก ดังนั้นในโหมดเข้มงวดไม่สามารถสร้างตัวแปรโกลบอลได้อีกต่อไป คุณควรประกาศตัวแปรทั้งหมดของคุณอย่างชัดเจน
การรั่วไหลทั่วโลก
มีหลายสถานการณ์ที่อาจทำให้เกิดthis
การผูกกับวัตถุส่วนกลาง ตัวอย่างเช่นถ้าคุณลืมใส่new
คำนำหน้าเมื่อเรียกใช้ฟังก์ชันคอนสตรัคเตอร์คอนสตรัคเตอร์this
จะถูกผูกไว้กับวัตถุทั่วโลกโดยไม่คาดคิดดังนั้นแทนที่จะเริ่มต้นวัตถุใหม่มันจะถูกดัดแปลงอย่างเงียบ ๆ ด้วยตัวแปรส่วนกลาง ในสถานการณ์เหล่านี้โหมดเข้มงวดจะเชื่อมโยงthis
กับundefined
ซึ่งจะทำให้ตัวสร้างสร้างข้อยกเว้นแทนทำให้ตรวจพบข้อผิดพลาดได้เร็วขึ้น
ความล้มเหลวที่มีเสียงดัง
JavaScript มีคุณสมบัติแบบอ่านอย่างเดียวเสมอ แต่คุณไม่สามารถสร้างมันเองได้จนกว่าObject.createProperty
ฟังก์ชันของ ES5 จะเปิดเผยความสามารถนั้น หากคุณพยายามกำหนดค่าให้กับคุณสมบัติแบบอ่านอย่างเดียวมันจะล้มเหลวอย่างเงียบ ๆ การมอบหมายจะไม่เปลี่ยนแปลงมูลค่าของทรัพย์สิน แต่โปรแกรมของคุณจะดำเนินการต่อราวกับว่ามันมี นี่คืออันตรายด้านความสมบูรณ์ที่อาจทำให้โปรแกรมเข้าสู่สถานะไม่สอดคล้องกัน ในโหมดเข้มงวดการพยายามเปลี่ยนคุณสมบัติแบบอ่านอย่างเดียวจะทำให้เกิดข้อยกเว้น
Octal
การแสดงตัวเลขฐานแปด (หรือฐาน 8) มีประโยชน์อย่างยิ่งเมื่อทำการตั้งโปรแกรมระดับเครื่องจักรบนเครื่องที่มีขนาดคำเท่ากับ 3 คุณต้องใช้เลขฐานแปดเมื่อทำงานกับเมนเฟรม CDC 6600 ซึ่งมีขนาดคำเท่ากับ 60 บิต หากคุณสามารถอ่านเลขฐานแปดคุณสามารถดูคำได้ 20 หลัก ตัวเลขสองหลักแสดงรหัส op และหนึ่งหลักระบุหนึ่งใน 8 การลงทะเบียน ในช่วงการเปลี่ยนภาพช้าจากรหัสเครื่องเป็นภาษาระดับสูงมีความคิดว่าจะเป็นประโยชน์ในการจัดเตรียมรูปแบบฐานแปดในภาษาการเขียนโปรแกรม
ใน C มีการเลือกตัวแทนที่เป็นโชคร้ายอย่างยิ่งของค่าแปด: นำหน้าศูนย์ ดังนั้นใน C 0100
หมายถึง 64 ไม่ใช่ 100 และ08
เป็นข้อผิดพลาดไม่ใช่ 8 ยิ่งไปกว่านั้นโชคร้ายที่สมัยนี้ได้ถูกคัดลอกไปเป็นภาษาสมัยใหม่เกือบทั้งหมดรวมถึง JavaScript ซึ่งใช้เพื่อสร้างข้อผิดพลาดเท่านั้น มันไม่มีวัตถุประสงค์อื่น ดังนั้นในโหมดเข้มงวดไม่อนุญาตให้ใช้แบบฟอร์มฐานแปด
เป็นต้น
อาเรย์อาร์กิวเมนต์หลอกจะกลายเป็นอาเรย์ที่คล้ายกันมากขึ้นใน ES5 ในโหมดเข้มงวดจะสูญเสียcallee
และcaller
คุณสมบัติ สิ่งนี้ทำให้สามารถส่งรหัสของคุณarguments
ไปยังรหัสที่ไม่น่าเชื่อถือได้โดยไม่ต้องละทิ้งบริบทที่เป็นความลับจำนวนมาก นอกจากนี้
arguments
คุณสมบัติของฟังก์ชั่นจะถูกกำจัดออก
ในโหมดเข้มงวดปุ่มที่ซ้ำกันในตัวอักษรฟังก์ชันจะสร้างข้อผิดพลาดทางไวยากรณ์ ฟังก์ชั่นไม่สามารถมีสองพารามิเตอร์ที่มีชื่อเดียวกัน ฟังก์ชั่นไม่สามารถมีตัวแปรที่มีชื่อเดียวกันกับหนึ่งในพารามิเตอร์ของมัน ฟังก์ชั่นไม่สามารถdelete
ใช้ตัวแปรของตัวเอง ความพยายามใน
delete
การใช้คุณสมบัติที่ไม่สามารถกำหนดค่าได้เกิดข้อยกเว้น ค่าดั้งเดิมไม่ได้ถูกห่อโดยปริยาย
คำที่สงวนไว้สำหรับเวอร์ชัน JavaScript ในอนาคต
ECMAScript 5 เพิ่มรายการคำที่สงวนไว้ หากคุณใช้พวกเขาเป็นตัวแปรหรือข้อโต้แย้งโหมดเข้มงวดจะโยนข้อผิดพลาด คำสงวนคือ:
implements
, interface
, let
, package
, private
, protected
, public
, static
และyield
อ่านเพิ่มเติม