1.什么是严格模式?
-
为js定义了不同的解析与执行模型
-
对js代码进行约束,提高严谨性
-
可以更严格的检查js代码错误
- 如:变量不声明,不可以直接使用
-
可全局,可局部
- 如:应用到函数内部
IE10 以上的浏览器支持严格模式
2.严格模式的诞生是为了什么?
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度
- 为未来新版本的Javascript做好铺垫
3.如何使用严格模式?
// 全局严格模式
<script>
'use strict'
</script>
// 局部严格模式
<script>
function fn() {
'use strict'
console.log(this) // undefined
}
fn()
</script>
4.严格模式对语法和行为的改变有哪些?
变量
- 正常模式下:变量不声明直接赋值,该变量默认为全局变量
num1 = 10
console.log(num1) // 10
- 严格模式下:变量必须声明后,才能进行使用,否则会报错
'use strict'
num = 10 ❌
console.log(num)
let num1 = 10 ✅
console.log(num1)
- 严格模式下:不能删除已声明的变量
'use strict'
let num1 = 10
delete num1 ❌
this指向
- 正常模式下:普通函数内部的this,指向Window
function fn() {
console.log(this) // Window
}
fn()
- 严格模式下:普通函数内部的this,指向undefined
'use strict'
function fn1() {
console.log(this) // undefined
}
fn1()
对象
- 正常模式下:修改对象的只读属性,不会报错
const obj = {}
Object.defineProperty(obj, 'num', { value: 1, writable: false })
// 对obj的num属性,重新赋值
obj.num = 2 ✅
console.log(obj)
- 严格模式下:修改对象的只读属性,会报错
'use strict'
const obj = {}
Object.defineProperty(obj, 'num', { value: 1, writable: false })
// 对obj的num属性,重新赋值
obj.num = 2 ❌
console.log(obj)
函数
- 正常模式下:形参名重复时,后来者居上
function fn(uname, uname, age) {
console.log(uname) // 名字2
}
fn('名字1', '名字2', 18)
- 严格模式下:形参名重复时,会报错
'use strict'
function fn(uname, uname, age) {
console.log(uname) ❌
}
fn('名字1', '名字2', 18)
- 不能在for、if、while语句里声明函数
for(let i = 0; i<3; i++) {
function fn() {} ❌
}
保留字
在严格模式下:不能以class,extends,export,import,super等保留字作为 变量名