【笔记】JS的严格模式

前言

JS的严格模式学习笔记

严格模式的作用

  • 消除了JS愈发的一些不合理、不严谨之处,减少了一些怪异行为
  • 消除代码运行的一些不安全之处,保证代码运行的安全
  • 提高编译器效率,增加运行速度
  • 禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本JS做好铺垫,例如增添部分保留字

开启严格模式

为当前脚本中的所有代码启用严格模式

1
2
3
4
5
6
<script>
"use strict";

...

</script>

为当前函数中的所有代码启用严格模式

1
2
3
4
5
6
7
8
<script>
function 函数名() {
"use strict";

...

}
</script>

在当前类中的所有代码启用严格模式

  • 缺省值,无需配置,强制严格模式
1
2
3
4
5
class 类名 {

...

}

严格模式下的规定

  • 以下代码示例均为错误示例,可能会报错或运行结果超出预期

不会意外创建全局变量

1
2
3
function fn() {
key = "value";
}

静默错误强制报错

1
2
3
4
5
6
7
8
var obj = {
key: "value",
}

// 将指定属性设置为只读
Object.defineProperty(obj, "key", { writable: false })

obj.key = "value";

不能删除已经声明的变量

1
2
var key = "value";
delete key;

形参名不能相同

1
function fn(key, key) {}

八进制数必须用0o定义而不能用0定义

1
var key = 010;

eval中执行的函数不能为上层作用域定义变量

1
2
eval("var key = 'value'");
console.log(key);

this绑定不会自动转换成对象

1
2
3
4
function fn() {}
fn.apply(undefined) // this指向undefined
fn.apply(null) // this指向null
fn() // this指向undefined
  • 构造函数必须使用new才能使用
    • 因为在全局直接调用函数,this指向undefined,所以构造函数在不用new时不能使用
1
2
function fn() {}
var obj = fn();

不允许在非函数区域和非全局区域定义函数

1
2
3
if (true) {
function fn() {}
}

完成

参考文献

哔哩哔哩——黑马前端