除了正常运行模式,ES5添加了第二种运行模式:"严格模式"(strict mode)。
目的
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
- 消除代码运行的一些不安全之处,为代码的安全运行保驾护航
- 为未来新版本的Javascript做好铺垫
使用
-
针对整个脚本文件:将
use strict
放在脚本文件的第一行,则整个脚本文件将以严格模式运行。 -
针对单个函数:将
use strict
放在函数体的第一行,则整个函数以严格模式运行。如果浏览器不支持,则这句话只解析为一条简单的语句, 没有任何副作用。
-
脚本文件的变通写法:因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。
(function (){ "use strict"; // code })();
语法和行为改变
-
必须用var声明变量
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
-
静态绑定
1.创建eval作用域--正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
2.禁止使用with语句--因为with语句无法在编译时就确定,属性到底归属哪个对象。
-
禁止自定义的函数中的this指向window,禁止在函数内部遍历调用栈
使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
-
对象不能有重名的属性,函数不能有重名的参数
-
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
-
正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。
参考
-
网友评论