JavaScript严格模式总结

134 阅读2分钟

1.什么是严格模式?

  • 为js定义了不同的解析与执行模型

  • 对js代码进行约束,提高严谨性

  • 可以更严格的检查js代码错误

    • 如:变量不声明,不可以直接使用
  • 可全局,可局部

    • 如:应用到函数内部

IE10 以上的浏览器支持严格模式


2.严格模式的诞生是为了什么?

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
  2. 消除代码运行的一些不安全之处,保证代码运行的安全
  3. 提高编译器效率,增加运行速度
  4. 为未来新版本的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 = 10console.log(num) 

let num1 = 10console.log(num1)

严格模式.png


  • 严格模式下:不能删除已声明的变量
'use strict'
let num1 = 10
delete num1 ❌

严格模式.png

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 = 2console.log(obj) 

严格模式.png


  • 严格模式下:修改对象的只读属性,会报错
'use strict'
const obj = {}
Object.defineProperty(obj, 'num', { value: 1, writable: false })
// 对obj的num属性,重新赋值
obj.num = 2console.log(obj) 

严格模式.png

函数

  • 正常模式下:形参名重复时,后来者居上
      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)

严格模式.png


  • 不能在for、if、while语句里声明函数
for(let i = 0; i<3; i++) {
    function fn() {} ❌
}

保留字

在严格模式下:不能以class,extends,export,import,super等保留字作为 变量名