"use strict" 定義 javascript 代碼應該以 “嚴格模式” 執(zhí)行。
1. use strict 指令
"use strict" 是 javascript 1.8.5 中的新指令(ecmascript version 5)。
它不算一條語句,而是一段文字表達式,更早版本的 javascript 會忽略它。
"use strict"; 的作用是指示 javascript 代碼應該以“嚴格模式”執(zhí)行。
在嚴格模式中,您無法,例如,使用未聲明的變量。
以下版本的瀏覽器支持嚴格模式:
- 版本 10 以后的 ie
- 版本 4 以后的 firefox
- 版本 13 以后的 chrome
- 版本 5.1 以后的 safari
- 版本 12 以后的 opera
2. 聲明嚴格模式
通過在腳本或函數(shù)的開頭添加 "use strict"; 來聲明嚴格模式。
在腳本開頭進行聲明,擁有全局作用域(腳本中的所有代碼均以嚴格模式來執(zhí)行):
范例
"use strict";
x = 3.14; // 這會引發(fā)錯誤,因為 x 尚未聲明
范例
"use strict";
myfunction();
function myfunction() {
y = 3.14; // 這會引發(fā)錯誤,因為 y 尚未聲明 }
在函數(shù)中聲明嚴格模式,擁有局部作用域(只有函數(shù)中的代碼以嚴格模式執(zhí)行):
x = 3.14; // 這不會引發(fā)錯誤 myfunction(); function myfunction() { "use strict"; y = 3.14; // 這會引發(fā)錯誤 }
3. "use strict"; 語法
聲明嚴格模式的語法被設計為兼容更早版本的 javascript。
編譯 javascript 程序中的數(shù)值文字(比如 4+5)或字符串文字("bill gates")不會有負面效果。它只會編譯為不存在的變量然后消失。
所有 "use strict"; 只會對“理解”其含義的新編譯器產(chǎn)生影響。
4. 為什么使用嚴格模式?
嚴格模式使我們更容易編寫“安全的” javascript。
嚴格模式把之前可接受的“壞語法”轉(zhuǎn)變?yōu)檎鎸嵉腻e誤。
舉例來說,在普通的 javascript 中,錯打變量名會創(chuàng)建新的全局變量。在嚴格模式中,此舉將拋出錯誤,這樣就不可能意外創(chuàng)建全局變量。
在普通 javascript 中,如果向不可寫屬性賦值,開發(fā)者不會得到任何錯誤反饋。
在嚴格模式中,向不可寫的、只能讀取的、不存在的屬性賦值,或者向不存在的變量或?qū)ο筚x值,將拋出錯誤。
5. 嚴格模式中不允許的事項
在不聲明變量的情況下使用變量,是不允許的:
"use strict";
x = 3.14; // 這將引發(fā)錯誤
對象也是變量
在不聲明對象的情況下使用對象也是不允許的:
"use strict";
x = {p1:10, p2:20}; // 這將引發(fā)錯誤
刪除變量(或?qū)ο螅┦遣辉试S的:
"use strict";
var x = 3.14;
delete x; // 這將引發(fā)錯誤
刪除函數(shù)是不允許的:
"use strict";
function x(p1, p2) {};
delete x; // 這將引發(fā)錯誤
重復參數(shù)名是不允許的:
"use strict";
function x(p1, p1) {}; // 這將引發(fā)錯誤
八進制數(shù)值文本是不允許的:
"use strict";
var x = 010; // 這將引發(fā)錯誤
轉(zhuǎn)義字符是不允許的:
"use strict";
var x = \010; // 這將引發(fā)錯誤
寫入只讀屬性是不允許的:
"use strict";
var obj = {};
object.defineproperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 這將引發(fā)錯誤
寫入只能獲取的屬性是不允許的:
"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; // 這將引發(fā)錯誤
刪除不可刪除的屬性是不允許的:
"use strict";
delete object.prototype; // 這將引發(fā)錯誤
字符串 "eval" 不可用作變量:
"use strict";
var eval = 3.14; // 這將引發(fā)錯誤
字符串 "arguments" 不可用作變量:
"use strict";
var arguments = 3.14; // 這將引發(fā)錯誤
with 語句是不允許的:
"use strict";
with (math){x = cos(2)}; // 這將引發(fā)錯誤
處于安全考慮,不允許 eval() 在其被調(diào)用的作用域中創(chuàng)建變量:
"use strict";
eval ("var x = 2");
alert (x); // 這將引發(fā)錯誤
在類似 f() 的函數(shù)調(diào)用中,this 的值是全局對象。在嚴格模式中,現(xiàn)在它成為了 undefined。
6. 對未來的保障
嚴格模式中不允許使用為未來預留的關鍵詞。它們是:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
"use strict";
var public = 1500; // 這將引發(fā)錯誤
7. 警告
"use strict" 指令只能在腳本或函數(shù)的開頭被識別。