JavaScript Strict Mode
"use strict";
定義了 JavaScript 程式碼應在“嚴格模式”下執行。
"use strict" 指令
"use strict"
指令是 ECMAScript 版本 5 中的新特性。
它不是一個語句,而是一個字面量表達式,會被早期版本的 JavaScript 忽略。
"use strict"
的目的是表明程式碼應在“嚴格模式”下執行。
在嚴格模式下,您不能使用未宣告的變數,例如。
除了 Internet Explorer 9 及更早版本,所有現代瀏覽器都支援“use strict”。
指令 | |||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
表格中的數字表示完全支援該指令的第一個瀏覽器版本。
您可以在所有程式中使用嚴格模式。它可以幫助您編寫更清晰的程式碼,例如防止您使用未宣告的變數。
"use strict"
只是一個字串,所以即使 IE 9 不理解它,也不會丟擲錯誤。
宣告嚴格模式
嚴格模式透過在指令碼或函式的開頭新增 "use strict"; 來宣告。
在指令碼開頭宣告,它具有全域性作用域(指令碼中的所有程式碼都將在嚴格模式下執行)
在函式內宣告,它具有區域性作用域(只有函式內的程式碼在嚴格模式下執行)
x = 3.14; // 這不會導致錯誤。
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 這將導致錯誤
}
自己動手試一試 »
“use strict”; 語法
宣告嚴格模式的語法旨在與早期版本的 JavaScript 相容。
在 JavaScript 程式中編譯數字字面量 (4 + 5;) 或字串字面量 ("John Doe";) 沒有副作用。它只是編譯成一個不存在的變數並失效。
因此,"use strict";
只對“理解”其含義的新編譯器有意義。
為什麼使用嚴格模式?
嚴格模式有助於編寫更“安全”的 JavaScript。
嚴格模式將之前被接受的“壞語法”變成真正的錯誤。
例如,在普通 JavaScript 中,拼錯變數名會建立一個新的全域性變數。在嚴格模式下,這會丟擲錯誤,使得意外建立全域性變數成為不可能。
在普通 JavaScript 中,開發人員不會收到任何錯誤反饋來為不可寫屬性賦值。
在嚴格模式下,任何對不可寫屬性、只讀屬性、不存在的屬性、不存在的變數或不存在的物件進行的賦值都將丟擲錯誤。
在嚴格模式下不允許
使用未宣告的變數是不允許的
"use strict";
x = 3.14; // 這將導致錯誤
物件也是變數。
使用未宣告的物件是不允許的
"use strict";
x = {p1:10, p2:20}; // 這將導致錯誤
刪除變數(或物件)是不允許的。
"use strict";
let x = 3.14;
delete x; // 這將導致錯誤
刪除函式是不允許的。
"use strict";
function x(p1, p2) {};
delete x; // 這將導致錯誤
重複引數名是不允許的
"use strict";
function x(p1, p1) {}; // 這將導致錯誤
八進位制數字字面量是不允許的
"use strict";
let x = 010; // 這將導致錯誤
八進位制跳脫字元是不允許的
"use strict";
let x = "\010"; // 這將導致錯誤
寫入只讀屬性是不允許的
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 這將導致錯誤
寫入只讀屬性是不允許的
"use strict";
const obj = {get x() {return 0} };
obj.x = 3.14; // 這將導致錯誤
刪除不可刪除的屬性是不允許的
"use strict";
delete Object.prototype; // 這將導致錯誤
單詞 eval
不能用作變數
"use strict";
let eval = 3.14; // 這將導致錯誤
單詞 arguments
不能用作變數
"use strict";
let arguments = 3.14; // 這將導致錯誤
with
語句是不允許的
"use strict";
with (Math){x = cos(2)}; // 這將導致錯誤
出於安全原因,不允許 eval()
從其被呼叫的作用域建立變數。
函式中的 this
關鍵字在嚴格模式下的行為不同。
this
關鍵字引用呼叫函式的物件。
如果未指定物件,嚴格模式下的函式將返回 undefined
,而普通模式下的函式將返回全域性物件 (window)
"use strict";
function myFunction() {
alert(this); // 將會 alert "undefined"
}
myFunction();
面向未來!
未來 JavaScript 版本保留的關鍵字不能在嚴格模式下用作變數名。
這些是
- implements
- interface
- let
- package
- private
- protected
- 公共
- static
- yield
"use strict";
let public = 1500; // 這將導致錯誤
注意!
"use strict" 指令只能在指令碼或函式的開頭被識別。