โหมดแบบที่เข้มงวดของ JavaScript
- หน้าก่อนหน้า JS Hoisting
- หน้าต่อไป ใครซีเคียม JS
"use strict";
กำหนดว่ารหัส JavaScript ควรทำงานใน "โหมดแบบที่เข้มงวด"
คำสั่ง "use strict"
"use strict"
เป็นคำสั่งใหม่ใน JavaScript 1.8.5 (ECMAScript version 5)
มันไม่นับเป็นคำสั่ง แต่เป็นรูปแบบของการแสดงความเป็นตัวแปร ภาษาบอร์นแบบรุ่นเก่าจะละเลยมันไป
"use strict";
มีความหมายว่าต้องการให้รหัส JavaScript ทำงานใน "โหมดแบบที่เข้มงวด"
ในภาษาบอร์นแบบ คุณจะไม่สามารถใช้ตัวแปรที่ยังไม่ได้ประกาศได้ ตัวอย่างเช่น
ตัวอย่างตัวเลขของเบราเซอร์ที่สนับสนุนภาษาบอร์นแบบ:
- ตั้งแต่รุ่น 10 ของ IE
- ตั้งแต่รุ่น 4 ของ Firefox
- ตั้งแต่รุ่น 13 ของ Chrome
- ตั้งแต่รุ่น 5.1 ของ Safari
- ตั้งแต่รุ่น 12 ของ Opera
ประกาศภาษาบอร์นแบบ
โดยเพิ่ม "use strict";
เพื่อประกาศภาษาบอร์นแบบ
การประกาศภาษาบอร์นแบบที่อยู่ที่ต้นสคริปต์ มีดินแดนการใช้งานทั่วไป (ทุกตัวแปรในสคริปต์ทำงานในภาษาบอร์นแบบ)
ตัวอย่าง
"use strict"; x = 3.14; // จะทำให้เกิดข้อผิดพลาด เพราะ x ยังไม่ได้ประกาศ
ตัวอย่าง
"use strict"; myFunction(); function myFunction() { y = 3.14; // จะทำให้เกิดข้อผิดพลาด เพราะ y ยังไม่ได้ประกาศ }
การประกาศภาษาบอร์นแบบในภาคนอกฟังก์ชัน มีดินแดนการใช้งานท้องถิ่น (เฉพาะรหัสที่อยู่ในฟังก์ชันที่ทำงานในภาษาบอร์นแบบ)
x = 3.14; // จะไม่ทำให้เกิดข้อผิดพลาด myFunction(); function myFunction() { "use strict"; y = 3.14; // จะทำให้เกิดข้อผิดพลาด }
"use strict"; ภาษาบอร์นแบบ
การประกาศภาษาบอร์นแบบที่เป็นไปตามมาตราฐานเพื่อให้สามารถใช้กับ JavaScript รุ่นเก่า
คอมไพล์ความเป็นตัวเลขของ JavaScript หรือตัวเลขสาย (เช่น 4+5) หรือตัวเลขข้อความ ("Bill Gates") จะไม่มีผลลบประมาณ มันเพียงแค่คอมไพล์เป็นตัวแปรที่ไม่มีอยู่และหายไป
所有 "use strict";
只会对“理解”其含义的新编译器产生影响。
为什么使用严格模式?
严格模式使我们更容易编写“安全的” JavaScript。
严格模式把之前可接受的“坏语法”转变为真实的错误。
举例来说,在普通的 JavaScript 中,错打变量名会创建新的全局变量。在严格模式中,此举将抛出错误,这样就不可能意外创建全局变量。
在普通 JavaScript 中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
在严格模式中,向不可写的、只能读取的、不存在的属性赋值,或者向不存在的变量或对象赋值,将抛出错误。
严格模式中不允许的事项
在不声明变量的情况下使用变量,是不允许的:
"use strict"; x = 3.14; // 这将引发错误
对象也是变量
在不声明对象的情况下使用对象也是不允许的:
"use strict"; x = {p1:10, p2:20}; // 这将引发错误
删除变量(或对象)是不允许的:
"use strict"; var x = 3.14; delete x; // จะทำให้เกิดข้อผิดพลาด
การลบฟังก์ชัน ไม่อนุญาต:
"use strict"; function x(p1, p2) {}; delete x; // จะทำให้เกิดข้อผิดพลาด
การใช้ชื่อตัวแปรที่ซ้ำกัน ไม่อนุญาต:
"use strict"; function x(p1, p1) {}; // จะทำให้เกิดข้อผิดพลาด
ข้อความเลขกะทิบไม่อนุญาต:
"use strict"; var x = 010; // จะทำให้เกิดข้อผิดพลาด
ตัวอักษรหลอดเลขไม่อนุญาต:
"use strict"; var x = \010; // จะทำให้เกิดข้อผิดพลาด
การเขียนคุณสมบัติที่เป็นการอ่านเท่านั้น ไม่อนุญาต:
"use strict"; var obj = {}; Object.defineProperty(obj, "x", {value:0, writable:false}); obj.x = 3.14; // จะทำให้เกิดข้อผิดพลาด
การเขียนคุณสมบัติที่สามารถเขียนได้เท่านั้น ไม่อนุญาต:
"use strict"; var obj = {get x() {return 0} }; obj.x = 3.14; // จะทำให้เกิดข้อผิดพลาด
การลบคุณสมบัติที่ไม่สามารถลบได้ ไม่อนุญาต:
"use strict"; delete Object.prototype; // จะทำให้เกิดข้อผิดพลาด
ตัวแปร "eval" ไม่สามารถใช้เป็นตัวแปร:
"use strict"; var eval = 3.14; // จะทำให้เกิดข้อผิดพลาด
ตัวแปร "arguments" ไม่สามารถใช้เป็นตัวแปร:
"use strict"; var arguments = 3.14; // จะเกิดข้อผิดพลาด
with
คำสั่งนี้ไม่อนุญาตใช้
"use strict"; with (Math){x = cos(2)}; // จะเกิดข้อผิดพลาด
ไม่อนุญาตให้ใช้คำสั่ง with สำหรับเหตุผลที่เกี่ยวกับความปลอดภัย eval()
ที่ถูกเรียกใช้ในที่ส่วนของการทำงาน
"use strict"; eval ("var x = 2"); alert (x); // จะเกิดข้อผิดพลาด
ในการเรียกใช้ฟังก์ชันที่คล้าย f() ค่าของ this คืออนุกายวิญญาณโลก ในโหมดรักษาความเรียบร้อยตอนนี้มันกลายเป็น undefined
。
การปกป้องต่ออนาคต
ไม่อนุญาตให้ใช้คำที่ยังไม่มีการใช้ในอนาคตในโหมดรักษาความเรียบร้อย มันคือ:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
"use strict"; var public = 1500; // จะเกิดข้อผิดพลาด
คำเตือน
"use strict"
คำสั่งสามารถใช้ได้เมื่ออยู่ในสคริปต์หรือฟังก์ชันที่เริ่มต้นที่ถูกจับตามอง
- หน้าก่อนหน้า JS Hoisting
- หน้าต่อไป ใครซีเคียม JS