"use strict"; กำหนดว่ารหัส JavaScript ควรจะดำเนินการในโหมด "เข้มงวด"
"use strict" Directive
"use strict" สั่งใหม่ใน JavaScript 1.8.5 (ECMAScript version 5)
มันไม่ได้เป็นคำสั่ง แต่การแสดงออกที่แท้จริงโดยไม่สนใจเวอร์ชันก่อนหน้าของ JavaScript
วัตถุประสงค์ของการ "use strict" คือการแสดงให้เห็นว่ารหัสควรจะดำเนินการในโหมด "เข้มงวด"
ด้วยโหมดเข้มงวดคุณจะไม่สามารถยกตัวอย่างเช่นการใช้ตัวแปรที่ไม่ได้ประกาศ
โหมดการเข้มงวดการสนับสนุนใน:
เช่นจากรุ่น 10 จาก Firefox 4 รุ่น
Chrome จากรุ่น 13 Safari จากรุ่น 5.1
Opera จากรุ่น 12
ประกาศอย่างเคร่งครัดโหมด
โหมดเข้มงวดมีการประกาศโดยการเพิ่ม "use strict"; จุดเริ่มต้นของสคริปต์หรือฟังก์ชั่น
ประกาศที่จุดเริ่มต้นของสคริปต์ก็มีขอบเขตทั่วโลก (รหัสทั้งหมดในสคริปต์ที่จะดำเนินการอย่างเข้มงวดในโหมด):
ตัวอย่าง
"use strict";
myFunction();
function myFunction() {
y = 3.14;
// This will also cause an error (y is not defined)
}
ลองตัวเอง» ประกาศภายในฟังก์ชันก็มีขอบเขตในท้องถิ่น (รหัสเฉพาะภายในฟังก์ชันอยู่ในโหมดที่เข้มงวด):
x = 3.14; // This will not cause an error.
myFunction();
function
myFunction() {
"use strict";
y = 3.14;
// This will cause an error (y is not defined)
}
ลองตัวเอง» "use strict"; ไวยากรณ์
ไวยากรณ์สำหรับการประกาศโหมดเข้มงวดถูกออกแบบมาให้เข้ากันได้กับรุ่นเก่าของ JavaScript
รวบรวมตัวเลขที่แท้จริง (4 + 5;) หรือสตริงตัวอักษร ("John Doe";) ในโปรแกรมจาวาสคริปต์ไม่มีผลข้างเคียง มันก็จะรวบรวมให้กับตัวแปรที่ไม่ใช่ที่มีอยู่และตาย
ดังนั้น "use strict" ; เพียง แต่มีความสำคัญกับคอมไพเลอร์ใหม่ที่ "เข้าใจ" ความหมายของมัน
ทำไมโหมดเข้มงวด?
โหมดเข้มงวดทำให้ง่ายต่อการเขียน "ปลอดภัย" JavaScript
โหมดเข้มงวดก่อนหน้านี้ได้รับการยอมรับการเปลี่ยนแปลงไวยากรณ์ "ไม่ดี" เป็นข้อผิดพลาดจริง
ตัวอย่างเช่นในปกติ JavaScript, mistyping ชื่อตัวแปรสร้างตัวแปรใหม่ทั่วโลก ในโหมดที่เข้มงวดนี้จะโยนความผิดพลาดทำให้มันเป็นไปไม่ได้ตั้งใจสร้างตัวแปรทั่วโลก
ปกติ JavaScript, นักพัฒนาจะไม่ได้รับการตอบรับข้อผิดพลาดใด ๆ การกำหนดค่าคุณสมบัติไม่สามารถเขียนได้
ในโหมดที่เข้มงวดมอบหมายใด ๆ ไปยังสถานที่ให้บริการที่ไม่สามารถเขียนเป็นคุณสมบัติทะเยอทะยานอย่างเดียวที่ไม่มีอยู่คุณสมบัติตัวแปรไม่ใช่ที่มีอยู่หรือไม่มีอยู่วัตถุจะโยนความผิดพลาด
ไม่ได้รับอนุญาตในโหมดเข้มงวด
ใช้ตัวแปรโดยไม่ต้องประกาศว่าจะไม่ได้รับอนุญาต:
"use strict";
x = 3.14; // This
will cause an error (x is not defined)
วัตถุที่เป็นตัวแปรมากเกินไป
การใช้วัตถุโดยไม่ต้องประกาศว่าจะไม่ได้รับอนุญาต:
"use strict";
x =
{p1:10, p2:20}; // This
will cause an error (x is not defined)
การลบตัวแปร (หรือวัตถุ) ไม่ได้รับอนุญาต
"use strict";
var x = 3.14;
delete x; // This
will cause an error
การลบฟังก์ชั่นไม่ได้รับอนุญาต
"use strict";
function x(p1, p2) {};
delete x;
// This will cause an error
ทำซ้ำชื่อพารามิเตอร์จะไม่ได้รับอนุญาต:
"use strict";
function x(p1, p1) {}; // This will cause an error
ฐานแปดตัวอักษรเป็นตัวเลขไม่ได้รับอนุญาต:
"use strict";
var x = 010; // This
will cause an error
หนีตัวอักษรไม่ได้รับอนุญาต:
"use strict";
var x = \010; // This will cause an error
การเขียนไปยังสถานที่ให้บริการอ่านอย่างเดียวไม่ได้รับอนุญาต:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // This
will cause an error
การเขียนไปยังที่พักได้รับเพียงไม่ได้รับอนุญาต:
"use strict";
var obj = {get x()
{return 0} };
obj.x = 3.14; // This
will cause an error
การลบคุณสมบัติ undeletable ไม่ได้รับอนุญาต:
"use strict";
delete Object.prototype; // This will cause an error
สตริง "EVAL" ไม่สามารถนำมาใช้เป็นตัวแปร:
"use strict";
var eval = 3.14; // This will cause an error
สตริง "ข้อโต้แย้ง" ไม่สามารถนำมาใช้เป็นตัวแปร:
"use strict";
var arguments = 3.14; // This will cause an error
ที่มีคำสั่งไม่อนุญาตให้ใช้:
"use strict";
with (Math){x = cos(2)}; // This will cause an error
สำหรับเหตุผลด้านความปลอดภัย eval() ไม่ได้รับอนุญาตให้สร้างตัวแปรในขอบเขตจากการที่มันถูกเรียกว่า:
"use strict";
eval ("var x = 2");
alert (x); // This
will cause an error
ในการเรียกฟังก์ชันเช่น f() ค่านี้คือวัตถุทั่วโลก ในโหมดที่เข้มงวดก็คือตอนนี้ไม่ได้กำหนด
พิสูจน์ได้ในอนาคต!
คำหลักที่สงวนไว้ในอนาคตไม่ได้รับอนุญาตในโหมดที่เข้มงวด เหล่านี้คือ:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
"use strict";
var public = 1500; // This will cause an error
ระวัง!
ระวัง!
"use strict" สั่งได้รับการยอมรับเพียงจุดเริ่มต้นของสคริปต์หรือฟังก์ชั่น