โหมดแบบที่เข้มงวดของ JavaScript

"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" คำสั่งสามารถใช้ได้เมื่ออยู่ในสคริปต์หรือฟังก์ชันที่เริ่มต้นที่ถูกจับตามอง