บทความนี้นำเสนอความรู้ที่เกี่ยวข้องเกี่ยวกับ JavaScript ซึ่งส่วนใหญ่จะแนะนำปัญหาที่เกี่ยวข้องกับโหมดเข้มงวดนั้นง่ายต่อการเข้าใจ มันเป็นโหมด JavaScript ที่มีข้อจำกัด ซึ่งทำให้โค้ดแยกออกจาก " "โหมด Lazy" โดยปริยาย มาดูกันดีกว่า ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน
[คำแนะนำที่เกี่ยวข้อง: วิดีโอสอน JavaScript, ส่วนหน้าของเว็บ]
ในมาตรฐาน ECMAScript5 JavaScript เสนอแนวคิดของโหมดเข้มงวด:
โหมดเข้มงวดนั้นเข้าใจง่าย มันเป็นโหมด JavaScript ที่จำกัด ซึ่งทำให้โค้ดแยกออกจาก "โหมดขี้เกียจ" โดยปริยาย
เมื่อเบราว์เซอร์ที่รองรับโหมดเข้มงวดตรวจพบโหมดเข้มงวดในโค้ด เบราว์เซอร์จะตรวจจับและรันโค้ดในลักษณะที่เข้มงวดมากขึ้น
โหมดเข้มงวดกำหนดข้อจำกัดบางประการเกี่ยวกับซีแมนทิกส์ JavaScript ปกติ:
โหมดเข้มงวดจะกำจัด ข้อผิดพลาดที่ไม่มีการโต้ตอบ ดั้งเดิมบางประการโดย การโยนข้อผิดพลาดเหล่านั้น
โหมดเข้มงวดช่วยให้กลไก JS ทำการเพิ่มประสิทธิภาพได้มากขึ้นเมื่อรันโค้ด (โดยไม่ต้องจัดการกับไวยากรณ์พิเศษบางอย่าง)
โหมดเข้มงวดจะปิดใช้งานไวยากรณ์บางอย่างที่อาจกำหนดไว้ใน ECMAScript เวอร์ชันต่อๆ ไป
แล้วจะเปิดใช้งานโหมดเข้มงวดได้อย่างไร? โหมดเข้มงวดรองรับการโยกย้ายแบบละเอียด:
สามารถรองรับการเปิดโหมดเข้มงวดในไฟล์ js;
นอกจากนี้ยังรองรับการเปิดโหมดเข้มงวดสำหรับฟังก์ชั่นบางอย่าง
JavaScript ได้รับการออกแบบมาเพื่อให้นักพัฒนามือใหม่ใช้งานได้ง่ายขึ้น ดังนั้นบางครั้งจึงมีไวยากรณ์ที่ไม่ถูกต้อง แต่อย่าคิดว่าจะสามารถแยกวิเคราะห์ได้ตามปกติ
อย่างไรก็ตาม วิธีการนี้อาจทิ้งความเสี่ยงด้านความปลอดภัย
ในโหมดเข้มงวด ธุรกรรมประเภทนี้จะถือเป็นข้อผิดพลาดเพื่อให้สามารถค้นพบและแก้ไขได้อย่างรวดเร็ว
ต่อไปนี้เป็นบทสรุปของข้อจำกัดทั่วไปบางประการ:
มีสองวิธีในการสร้างตัวแปรส่วนกลางโดยไม่ตั้งใจ:
ประกาศตัวแปรทั่วโลกโดยตรงโดยไม่ต้องใช้คำหลัก
หากคุณประกาศตัวแปรโดยไม่ใช้คำสำคัญภายในฟังก์ชัน ฟังก์ชันนั้นจะได้รับการเลื่อนระดับเป็นตัวแปรร่วมตามค่าเริ่มต้น โค้ดตัวอย่างจะเป็นดังนี้:
'ใช้อย่างเข้มงวด' // ปิดใช้งานการสร้างตัวแปรโกลบอลโดยไม่ตั้งใจ ข้อความ = 'การสร้างตัวแปรโกลบอลโดยไม่ได้ตั้งใจ' console.log(message) //ข้อความแสดงข้อผิดพลาดคือ: Uncaught ReferenceError: ไม่ได้กำหนดข้อความ ฟังก์ชั่นฟู () { อายุ=20 console.log (อายุ) - foo() // ReferenceError: ไม่ได้กำหนดอายุ
รหัสตัวอย่างจะเป็นดังนี้:
// เปิดใช้งานโหมดเข้มงวดและแปลงปัญหาเป็นข้อผิดพลาด 'use strict' โดยตรง const v = 100;//(กำหนดค่าคงที่) v = 1.14; //กำหนดค่าใหม่ (ให้กับตัวแปร) console.log(v); // Uncaught TypeError: การกำหนดให้กับตัวแปรคงที่
ในโหมดเข้มงวด คุณไม่สามารถใช้โอเปอเรเตอร์ยกเลิกการเลือกกับตัวแปรได้
// เปิดโหมดเข้มงวด 'ใช้เข้มงวด' วาร์ วี = 100; ลบ v;//ในโหมดที่ไม่เข้มงวด: นี่เป็นความล้มเหลวแบบไม่มีการแจ้ง ไม่มีการรายงานข้อผิดพลาดหรือตัวแปร v จะถูกลบ console.log(v);//100 //หลังจากเปิดโหมดเข้มงวด จะมีการรายงานข้อผิดพลาดแทน ลบตัวระบุที่ไม่ผ่านการรับรองในโหมดเข้มงวด
ในโหมดเข้มงวด การใช้คีย์เวิร์ด Delete สำหรับอาร์เรย์และแอ็ตทริบิวต์เมธอดจะมีผลเช่นเดียวกัน
// เปิดโหมดเข้มงวด 'ใช้เข้มงวด' // 1. ลบเนื้อหาอาเรย์ในโหมดเข้มงวด var arr = [1,2,3,4] ลบ arr[0]; console.log(arr);//[ <1 รายการว่าง>, 2, 3, 4 ] // 2. คุณลักษณะของฟังก์ชันลบในโหมดเข้มงวด var obj = { ชื่อ'มนุษย์หมู' - ลบ obj.name; console.log(obj.name)//ไม่ได้กำหนด
รหัสตัวอย่างจะเป็นดังนี้:
'ใช้อย่างเข้มงวด' // ไม่อนุญาตให้ใช้ฟังก์ชันที่มีชื่อพารามิเตอร์เดียวกัน ฟังก์ชัน foo2 (x, y, x) { console.log(x, y, x) - foo2(10, 20, 30) // SyntaxError: ไม่อนุญาตให้ใช้ชื่อพารามิเตอร์ที่ซ้ำกันในบริบทนี้
รหัสตัวอย่างจะเป็นดังนี้:
// ไม่อนุญาตให้ใช้รูปแบบฐานแปดดั้งเดิม var num1 = 0123 var num2 = 0o123 // สามารถเขียนในรูปแบบนี้เป็นฐานแปด var num3 = 0x123 // สามารถเขียนในรูปแบบนี้เป็นเลขฐานสิบหก var num4 = 0b100 // สามารถเขียนในรูปแบบนี้เป็น binary console.log(num1) // SyntaxError: ไม่อนุญาตให้ใช้ตัวอักษรฐานแปดในโหมดเข้มงวด console.log(num2, num3, num4) // 83 291 4
รหัสตัวอย่างจะเป็นดังนี้:
'ใช้อย่างเข้มงวด' var message = 'สวัสดีชาวโลก'; var obj = { ชื่อ: 'แยม' อายุ: 20 } //คำสั่ง with สามารถสร้างขอบเขตของตัวเองได้ เมื่อพิมพ์ age ในคำสั่ง with คุณลักษณะ age ในวัตถุ obj จะถูกส่งออก อย่างไรก็ตาม เมื่อมีการพิมพ์ข้อความแอตทริบิวต์ที่ไม่มีอยู่จริงในคำสั่ง with ก็จะถูกพิมพ์ออกมา หนึ่งระดับไปยังขอบเขตภายนอก หนึ่งระดับเพื่อค้นหาฟังก์ชัน foo () { ด้วย (obj) { console.log (อายุ) console.log (ข้อความ) - console.log (ข้อความ) - foo() // SyntaxError: โค้ดโหมดเข้มงวดต้องไม่มีคำสั่ง with
รหัสตัวอย่างจะเป็นดังนี้:
var jsString = "var message = 'สวัสดีชาวโลก';console.log(ข้อความ)" eval(jsString) // ส่งออกสวัสดีชาวโลก console.log(message) //ข้อความแสดงข้อผิดพลาดคือ: ReferenceError: ไม่ได้กำหนดข้อความ
开启严格模式eval函数不会向上引用变量所以全局作用域就没有message这个变量所以会报错
รหัสตัวอย่างจะเป็นดังนี้:
'ใช้อย่างเข้มงวด' // ในโหมดเข้มงวด ฟังก์ชั่นการดำเนินการด้วยตนเอง (การเชื่อมโยงเริ่มต้น) จะชี้ไปที่ไม่ได้กำหนด และในโหมดไม่เข้มงวด มันจะชี้ไปที่หน้าต่าง ฟังก์ชั่นฟู () { console.log(นี่) - foo() // ไม่ได้กำหนด