嚴格模式優勢:
消除Javascript語法的一些不合理、不嚴謹之處,減少一些意外情況出現;
消除代碼運行的一些不安全之處,保證代碼運行的安全;
提高編譯器效率,增加運行速度;
注意,同樣的代碼,在"嚴格模式"中,可能會有不一樣的運行結果;一些在"正常模式"下可以運行的語句,在"嚴格模式"下將不能運行。
嚴格模式的限制:
不允許使用未聲明的變量:
"use strict";
x = 3.14; // 報錯 (x 未定義)
"use strict";
x = {p1:10, p2:20}; // 報錯 (x 未定義)
不允許刪除變量或對象。
"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; // 報錯
不允許對一個使用getter方法讀取的屬性進行賦值
"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; // 報錯
不允許使用以下這種語句:
"use strict";
with (Math){x = cos(2)}; // 報錯
由於一些安全原因,在作用域 eval() 創建的變量不能被調用:
"use strict";
eval ("var x = 2");
alert (x); // 報錯
禁止this關鍵字指向全局對象。
function f(){
return !this;
}
// 返回false,因爲"this"指向全局對象,"!this"就是false
function f(){
"use strict";
return !this;
}
// 返回true,因爲嚴格模式下,this的值爲undefined,所以"!this"爲true。
因此,使用構造函數時,如果忘了加new,this不再指向全局對象,而是報錯。
function f(){
"use strict";
this.a = 1;
};
f();// 報錯,this未定義
保留關鍵字
爲了向將來Javascript的新版本過渡,嚴格模式新增了一些保留關鍵字:
implements
interface
let
package
private
protected
public
static
yield
"use strict";
var public = 1500; // 報錯
更多信息參考:菜鳥教程