靜態綁定:屬性和方法到底歸屬哪一個對象,在編譯階段就肯定。javascript
加強的安全措施html
禁止this關鍵字指向全局對象
使用構造函數時,若是忘了加new,this再也不指向全局對象,而是報錯。java
function f(){ "use strict"; this.a = 1; }; f();// 報錯,this未定義
禁止在函數內部遍歷調用棧安全
function f1(){ "use strict"; f1.caller; // 報錯 f1.arguments; // 報錯 }
顯示報錯
正常模式下,對一個對象的只讀屬性進行賦值,不會報錯,只會默默地失敗。嚴格模式下,將報錯。函數
"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 報錯
嚴格模式下,對一個使用getter方法讀取的屬性進行賦值,會報錯。this
"use strict"; var o = { get v() { return 1; } }; o.v = 2; // 報錯
嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。prototype
"use strict"; var o = {}; Object.preventExtensions(o); o.v = 1; // 報錯
嚴格模式下,刪除一個不可刪除的屬性,會報錯。code
"use strict"; delete Object.prototype; // 報錯
重名錯誤htm
arguments對象的限制對象
不容許對arguments賦值
"use strict"; arguments++; // 語法錯誤 var obj = { set p(arguments) { } }; // 語法錯誤 try { } catch (arguments) { } // 語法錯誤 function arguments() { } // 語法錯誤 var f = new Function("arguments", "'use strict'; return 17;"); // 語法錯誤
arguments再也不追蹤參數的變化
function f(a) {
return [a, arguments[0]];
}
f(1); // 正常模式爲[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 嚴格模式爲[2,1]
- 禁止使用arguments.callee 這意味着,你沒法在匿名函數內部調用自身了。
"use strict";
var f = function() { return arguments.callee; };
f(); // 報錯
函數必須聲明在頂層
未來Javascript的新版本會引入"塊級做用域"。爲了與新版本接軌,嚴格模式只容許在全局做用域或函數做用域的頂層聲明函數。也就是說,不容許在非函數的代碼塊內聲明函數。
if (true) {
function f() { } // 語法錯誤
}
for (var i = 0; i < 5; i++) {
function f2() { } // 語法錯誤
}
10. 保留字 嚴格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。使用這些詞做爲變量名將會報錯。 原文連接:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html