Javascript的作用域

69 阅读3分钟

作用域

  • 作用域就是一个变量可以生效的范围
  • 变量不是在所有地方都可以使用的,而这个变量的适用范围就是作用域

全局作用域

  • 全局作用域是最大的作用域

  • 在全局作用域中定义的变量可以在任何地方使用

  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域window

  • 这个作用域会一直存在,直到页面关闭就销毁了

    //下面这两个变量就是存在在全局作用域下的
    var num=100
    var num2=200
    

局部作用域

  • 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域

  • 在局部作用域中定义的变量只能在这个局部作用域内部使用

  • 在 js 中只有函数能生成一个局部作用域,别的都不行

  • 每一个函数都有一个作用域

    //全局作用域
    var num=100
    function fn(){
        //局部作用域,只能在fn()内使用
        var num1=200
    }
    

访问规则

  • 当我哦想要获取一个变量的值的时候,我们管这个行为叫做访问

  • 获取变量的规则:

    • 首先,在自己的作用域内查找,如果有就直接使用

    • 如果没有,就去上一级查找,如果有就直接使用

    • 如果没有,就继续去上一级作用域查找,一次类推

    • 如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量is not defined)

      var num=100
      function fn(){
          var num2 =200
          function fun(){
              var num3 = 300
              console.log(num3)//自己作用域内有,直接用
              console.log(num2)//自己作用域没用。去上一级,发现有就是用
              console.log(num)//自己作用域没有,去上一级,上一级没有再去上一级,返现有就直接使用
              console.log(a)//自己没有,上一级到全局都没有,就会报错
          }
      }
      
  • 变量的访问规则也叫做作用域的查找机制

  • 作用域的查找机制只能是向上寻找,不能向下寻找

赋值规则

  • 当你想给一个变量赋值的时候,那么就先要找到这个变量,在给他赋值

  • 变量赋值规则

    • 现在自己作用域内部查找,有就直接赋值

    • 没有就去上一级作用域内部查找,有就直接赋值

    • 还没有再去上一级作用域查找,悠久直接赋值

    • 如果一直找到全局作用域都没有,那么就把这个变量定义为全局变量再给他赋值

      function fn(){
          num=100
      }
      fn()
      // fn 调用以后,要给num赋值
      //查看自己的作用域内部没有 num变量
      //就会像上一级查找
      //上一级就是全局作用域,发现依旧没有
      //那么就会把num定义为全局变量,并为其赋值
      //所以fn()以后,全局就有一个变量叫做num并且值是100
      

作用域链

作用域链就是在访问一个变量的时候,如果当前作用域内没有

回去自己的腹肌作用域,也就是上一层作用域内查找,如果找到就直接使用,如果没有就继续去上有一曾查找,直到查找到,最顶层的全局作用域,如果找到就直接使用,如果没有,报错提示变量不存在(未定义),我们将这个一层一层向上查找的规律,叫做作用域链