"use strict"
- 全局变量显示声明
-
静态绑定:属性和方法到底归属哪个对象,在编译阶段就确定。
- 禁止使用with语句:因为with语句无法在编译时就确定属性到底归属哪个对象
- 创设eval作用域:正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。它所生成的变量只能用于eval内部。
-
增强的安全措施
-
禁止this关键字指向全局对象
使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义
-
禁止在函数内部遍历调用栈
function f1(){ "use strict"; f1.caller; // 报错 f1.arguments; // 报错 }
-
- 禁止删除变量:只有configurable设置为true的对象属性,才能被删除。
-
显示报错
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 报错
严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。
"use strict"; var o = { get v() { return 1; } }; o.v = 2; // 报错
严格模式下,对禁止扩展的对象添加新属性,会报错。
"use strict"; var o = {}; Object.preventExtensions(o); o.v = 1; // 报错
严格模式下,删除一个不可删除的属性,会报错。
"use strict"; delete Object.prototype; // 报错
-
重名错误
- 对象不能有重名的属性:正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
- 函数不能有重名的参数:正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。
- 禁止八进制表示法:整数第一位为0,将报错。
-
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。