美文网首页
关于作用域链

关于作用域链

作者: 西红柿w | 来源:发表于2018-05-19 11:34 被阅读0次

    要了解作用域链,首先呢,先了解一下,什么是作用域

    作用域

    作用域,顾名思义就是起作用的区域。先看一个例子吧:

    var a = 1
    function fn1(){
      function fn2(){
        console.log(a)
      }
      function fn3(){
        var a = 4
        fn2()
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn()
    

    在这个例子中一共有3层,从里往外看吧,最外层叫做全局变量,往里面看,function fn1()里面包裹着fn2和fn3,这是个局部变量,而里面呢,fn2和fn3也是一个局部变量,只是针对的对象不同,这是它的一个结构。

    全局变量:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的。
    局部变量:和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的。
    看到这里大家应该对于作用域有了一定的了解了。
    那上面这个代码,控制台输出为a的值,那a的值为什么呢?带着这个问题,咱们继续了解一下作用域链

    作用域链

    作用域链:js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。

    看上一个例子吧,控制台输出a的值,但在fn2中并没有定义a的值,那么就往包裹着fn2的区域找,也就是fn1,定义变量a为2,所以就输出2。如果fn1中也没有定义a的值,那就在往外一层找,直到找到全局变量。

    规则

    • 函数在执行过程中,先从自己内部找变量。
      *如果找不到,再从创建当前函数所在的作用域去找,以此往上。
      *注意找的是变量的当前状态。

    相关文章

      网友评论

          本文标题:关于作用域链

          本文链接:https://www.haomeiwen.com/subject/ywyodftx.html