严格模式 strict mode - IE10+
Objectives
消除JS语法中不合理不严谨的地方,减少怪异行为;
保证代码运行的安全;
提高编译器效率和运行速度;
为未来新版本作好铺垫;
Usage
全局模式 : 对整个脚本文件应用严格模式,在脚本第一行添加
‘use strict’
;局部模式 : 对某函数或方法应用严格模式,在函数/方法首部添加
‘use strict’
;这里注意
‘use strict’
前面不可以出现任何有效语句,即使是一个单独的分号也会使严格模式失效,在chrome(53)和IE(11)里测试结果都是如此;直接在脚本文件中应用严格模式不利于文件的合并,可以将每个单独的脚本文件放在一个立即执行的匿名函数之中;
在应用了严格模式的函数或方法中调用的其他函数/方法似乎并不需要符合严格模式;
- Details
- 变量声明 : 普通模式中未经过声明的变量直接进行赋值将使得该变量被当作全局变量,严格模式将会报错;
- 静态绑定 : 严格模式在一定程度上限制了JavaScript的“动态绑定”的特性,使得属性和方法具体归属于哪个对象在编译时就能够确定,这在一定程度上提高了编译效率,同时也增强了代码可读性,以避免意外的发生;其具体表现包括:
-
禁止使用
with
:with
语句的存在使得属性的归属对象无法在编译时确定
创设
eval
作用域:使得eval
语句所产生的变量只能作用于其内部,无法产生全局变量
-
- 安全增强:
-
禁止
this
指向全局变量 : 严格模式中使用构造器函数时如果没有使用new关键字,this
不会再绑定全局变量(window
)而是保持undefined
,会抛出引用错误;
-
禁止在函数内部遍历调用栈 : 无法遍历访问调用栈中函数本体(caller,非标准)和参数(arguments)
-
- 禁止删除变量 : 严格模式下无法删除变量。只有
configurable
属性设置为true的对象,才能被删除。
- 显式报错 :
-
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
-
严格模式下对一个只具有getter方法的属性进行赋值将会报错;
-
严格模式下对一个禁止扩充的对象进行扩充将会报错;
- 总之,严格模式下规范变得更加严格,不像普通模式一样在出错时静默处理,严格模式会显示地报错;
-
- 重名错误 :
- 普通模式中在一个对象里创建同名属性会使得顺序靠后的属性覆盖前面的属性,而在严格模式中这种作法会引起报错(实际测试在IE(11)中会报错,但在chrome(52)中没有报错);
- 函数中出现同名参数在严格模式下也会引起报错;
- 普通模式中在一个对象里创建同名属性会使得顺序靠后的属性覆盖前面的属性,而在严格模式中这种作法会引起报错(实际测试在IE(11)中会报错,但在chrome(52)中没有报错);
- 禁止八进制表示法:
-
在ES6中,允许使用"0o"作为前缀表示八进制.
- arguments对象限制
-
不允许对arguments赋值
-
arguments不再追踪参数的变化;
-
禁止使用arguments.callee,无法在匿名函数内部调用自身;
-
-
函数必须声明在顶层: 基于未来在JS中加入块级作用域的考虑,严格模式中只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
- 测试的时候没报错。
参考资料:
- 阮一峰 - Javascript 严格模式详解
http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html - MDN - Strict mode
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode