静态绑定:属性和方法到底归属哪一个对象,在编译阶段就肯定。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