ECMAScript 5的到来引入了严格模式,顾名思义,严格模式就是让javascript在一个更加规范的环境中运行。
让我们看看严格模式规范了哪些:
- 原本的静默错误在严格模式中将会抛出错误
- 严格模式进行了一些优化处理,有时候严格模式下的代码执行效率比普通代码要快
- 严格禁止一些可能会在未来规范中定义的语法模式
触发严格模式的方式
// 针对整个脚本文件 'use strict'; var v = "Hi! I'm a strict mode script!"; // 针对当前函数 function fn(){ 'use strict'; // other code }
由于javasript的设计并不完善,导致在一些本该抛出错误的情况下,并没有抛出错误,导致在未来对于问题的修复会更加的困难。严格模式的出现,使得原本正常模式下的静默错误,抛出错误。让开发者第一时间发现。严格模式的一些改变
- 全局变量显式申明
- 对保留字,关键字,以及一些具有不可改写特性的变量赋值时,会抛出错误
- 删除无法删除的属性时,会抛出错误
- 函数的参数重名,则抛出错误
- 禁止八进制表示法
- 禁止给原始数据附值 (string, number, boolean, null, undefined, symbol)
静态绑定
Javascript语言的一个特点,就是允许”动态绑定”,即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的。
- 禁止使用 with
- eval 语句生成的变量只能用于eval内部
- 禁止删除变量,只有configurable设置为true的对象属性,才能被删除
让eval和arguments更加简单
严格模式下的eval和arguments会减少奇怪的现象。
-
eval和arguments在严格模式下进行附值操作会抛出错误
-
严格模式下的arguments存储的是原始的参数值,不会追踪动态变化
function fn(a){ a = 2; console.log(a,arguments[0]); } fn(1) // 普通模式 => 2,2 // 严格模式 => 2,1
-
arguments.callee 不在被支持
“安全”的javascript
在严格模式下我们书写“安全”的Javascript。javascript通常在运行时进行检查,这一步是非常消耗性能的。严格模式的出现,能够一定程度上减少代码在运行时检查的需求。
- 禁止this关键字指向全局对象
- 禁止在函数内部遍历调用栈
为ECMAScript的未来做准备
- 函数必须声明在顶部
- 为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
- 新增了一些保留字保留字
在浏览器中使用严格模式
目前主流浏览器都已经支持了严格模式。但是我们不要过度依赖,因为目前在野生环境中存在只支持部分严格模式或者根本不支持的情况。所以当我们使用严格模式时,要做好浏览器检测。