严格模式
严格模式是 ECMAScript5 (ES5)发布的语言新特性。使用严格模式可以限制 JavaScript 的一些语言特性,使用严格模式可以去除在书写代码时的一些“骚操作”(有些特性在严格模式下是不可用的),使代码更整洁高效。
严格模式对正常的 JavaScript 语义做了一些更改:
- 严格模式通过抛出错误来消除了一些原有静默错误;
- 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快;
- 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法;
使用严格模式
使用严格模式也很简单,只要在 js 文件中写入 "use strict" 这一行文字即可。写了之后,该字符串所在的作用域中的代码就会遵循严格模式。
比如:
"use strict"
function aa(){
// ...
}
// ....
use strict 可以写在文件的许多位置,下面说一下在不同位置它起到的作用与作用范围。
- 将该字符串写在文件最顶部,这时整个文件的代码都会进入严格模式;
- 将字符放在函数顶部,那么严格模式只会给这个函数开启严格模式;
function strict(a,b){
"use strict"; // 给 strict 开启严格模式
return a + b;
}
- 不要将
use strict单独放在{}中,在这样的上下文中这么做 是没有效果的。
比如下面的代码,其实并没有开启严格模式:
{ "use strict" };
// some code ...
这是因为 {} 相当于一个作用域,上面相当于在一个作用域中使用严格模式,作用域外面的代码是不受约束的。因此可以看出,严格模式对它所在的作用域中的代码有效。
一个函数中的内容({}里的)就是一个作用域,ES6 类里的内容也是一个作用域;for 循环中也是一个作用域。
- 当打包文件时(多个文件打包成一个),你最好将所有的文件(打包之前的)都设置成严格模式或非严格模式,因为如果不这样做,打包后的文件可能并不是严格模式,可能会背离你的目的。或者将严格模式定义在函数中,这样或许能避免模式冲突。
严格模式中的变化
首先看几个例子,在不使用严格模式下运行代码是什么结果,而使用了严格模式又是什么结果。
1. 变量声明
考虑下面代码,运行后会出现什么结果:
"use strict";
a = 123;
console.log(a);
运行后会发现报错(a is not defined),这是因为 在严格模式下你必须声明变量,然后再赋值。
这样做的好处是,当你想使用一个局部变量时,却没有声明它,这时如果不使用严格模式,改变量默认会挂载到上层作用域中。有了严格模式可以帮助你检查这样的错误,同时也可以提高编码规范。
2. 相同的形参变量
考虑下面的代码:
function loose(a,a){
return a + a;
}
console.log(loose(2,4));
结果可能出乎意料,并没有报错,而且输出的是 8。只是因为在正常模式下,最后一个重名参数名会掩盖之前的重名参数。因此这个函数其实只有一个形参 a,4 才是它真正的实参。
在严格模式下这是会报错的。