严格模式就是让js代码在更严格的环境下运行。
目的:
- 消除JavaScript语法的不严谨和不合理之处,减少怪异行为。
- 消除代码运行的不安全之处,保证代码的运行安全。
- 提高编译器的效率,增加编译速度。
- 为未来新版本的Javascript做好铺垫。
同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。
进入严格模式的标志是下面语句,老版本不支持的浏览器就会忽略此语句:
“use strict”;
严格模式的几种调用方式:
- 放在脚本文件的第一行,整个脚本文件就会以严格模式执行,如果不在第一行,脚本文件将以正常模式运行。
- 放在函数内部第一行,整个函数就会以严格模式运行。
- 第一种方法不利于文件合并的情况,可以调用第二种方法,将脚本文件都放到一个匿名函数内执行。
(function () {
"use strict";
// some code here
})
严格模式对JavaScript的语法和行为都做了一些改变
- 全局变量要显式声明,不然会报错。
- 静态绑定,JavaScript是允许动态绑定的,属性和方法属于哪个对象在运行时确定,不在编译时确定。严格模式对动态绑定做了一些限制,只允许静态绑定,属性和方法属于哪个对象需要在编译时就要确定,这样做有利于编译效率的提高,代码更容易阅读。
- 禁止使用with语句。因为with语句语法在编译时确定属性属于哪个对象。
- 创建eval作用域。正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
增强的安全措施
- 禁止this指向全局作用域。
- 禁止在函数内部遍历调用栈
- 禁止删除变量:严格模式下将不能删除变量,只有configurable设置为true的才能删除。
- 显式报错。
- 重名错误。对象不能有重名的属性、函数不能有重名的参数。
- 禁止八进制表示法。
- arguments对象的限制:1、不允许对arguments赋值。2、不再追踪参数的变化。3、禁止使用arguments.callee,无法在匿名函数中调用自身了
- 函数必须声明在顶层
- 增加了一些保留字,用这些保留字命名变量将会报错。implements, interface, let, package, private, protected, public, static, yield。
function f1(){
"use strict";
f1.caller; // 报错
f1.arguments; // 报错
}
f1();
参考:阮一峰的网络日志 http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html