JS的严格模式和非严格模式
js运行有两种模式:一种是普通模式;一种是严格模式。
严格模式是ES5添加的,是比普通模式多一部分的js规则。如果在ES5之前js解析引擎,会忽略严格模式。
js一般默认是普通模式,ES6的模块和Class类默认是严格模式。
严格模式的使用
脚本范围
在script标签顶部直接使用 **“use strict”**可触发严格模式
"use strict"上面不能有可执行代码,否则失效;但是上面可以是注释内容或者空行。
<script>
console.log(1);
"use strict"; //上面有代码,自动失效
a=6;
</script>
<script>
/* 注释或者空行没有影响*/
"use strict"; // 严格模式;不允许出现未声明的变量
b=6; // Uncaught ReferenceError: b is not defined
</script>
在js文件的顶部使用 “use strict”,允许上面有注释和空行
// 注释和空行,整个文件都是严格模式,不会产生影响
"use strict";
函数范围
在函数内部的顶部使用 “use strict”,在函数内部是严格模式
function test() {
// 函数的注释
"use strict";
t = 7;
}
// 声明时不报错;执行时报错
test(); // Uncaught ReferenceError: t is not defined
arguments内置对象
- 严格模式下,不论参数如何变化,arguments对象不会发生改变
- 非严格模式下,参数的变化会同步到arguments对象中
在上述示例中,在非严格模式下,参数a的变化会同步到arguments[0],始终保持一致
this指向
- 严格模式下,禁止this指向window
"use strict"
var a = 50;
let obj = {
a: 10,
func: function () {
console.log(this);
console.log(this.a);
}
}
let fn = obj.func
obj.func()//this->{a: 10, func: ƒ}
fn();//严格模式:this->undefined this.a->报错 非严格模式:this->window this.a->50
参考链接:javascript严格模式