zhh10 / Notes

前端中react、Vue、ES6、css3、webpack、模块化等思维导图
12 stars 1 forks source link

JS严格模式 #19

Open zhh10 opened 4 years ago

zhh10 commented 4 years ago

进入严格模式

"use strict"

如何调用

  1. 针对单个脚本文件
  2. 针对单个函数
    function A(){
     "use strict"
     ......
    }

    语法和行为改变

  3. 全局变量显式声明 在正常模式下,如果一个变量没有声明就赋值,默认是全局变量。严格模式下禁止这种用法,全局变量必须是显式声明
    "use strict"
    v = 1 //报错
  4. 静态绑定 严格模式对动态绑定做了一些限制。某些情况下,只允许静态绑定,也就是说,属性和方法到底属于哪个对象,在编译阶段就确定,这样做有利于编译效率的提高。
    • 禁止使用with语句
      with(a){
      v = 2
      } //报错
    • 创设eval作用域 严格模式开设了第三种作用域:eval作用域 严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部
      "use strict"
      var x = 2;
      console.log(eval("var x = 5")) //5
      console.log(x) // 2 
    • 禁止this指向全局对象 严格模式下,this指向为undefined
      function A(){
      this.b = 123
      }
      A() 
      // 报错
    • caller和callee失效
    • 严格模式下无法删除变量,只有configurable设置为true的对象属性,才能被删除
      "use strict"
      var obj = {a:123}
      Object.defineproperty(obj,'a',{configurable:true})
      delete obj.a
      // 删除成功
    • arguments的限制
    • 不允许对arguments赋值
    • arguments不再跟踪参数的变化
    • 严格模式下只允许在全局作用域或函数作用域内声明函数