JavaScript 嚴格模式

"use strict"; 定義 JavaScript 代碼應該以“嚴格模式”執行。

"use strict" 指令

"use strict" 是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。

它不算一條語句,而是一段文字表達式,更早版本的 JavaScript 會忽略它。

"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)}; // 這將引發錯誤

親自試一試

處于安全考慮,不允許 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" 指令只能在腳本或函數的開頭被識別。