美文网首页
关于作用域链

关于作用域链

作者: 巴依老爷_0b46 | 来源:发表于2018-05-06 15:31 被阅读0次

    作用域

    先来谈谈变量的作用域
    变量的作用域无非就是两种:全局变量和局部变量。
    全局作用域:
    最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的:

    <script>
          var outerVar = "outer";
          function fn(){
             console.log(outerVar);
          }
          fn();//result:outer
       </script>
    

    局部作用域:
    和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部

    <script>
          function fn(){
             var innerVar = "inner";
          }
          fn();
          console.log(innerVar);// ReferenceError: innerVar is not defined
    </script>
    

    需要注意的是,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

    作用域链(Scope Chain)

    那什么是作用域链?
    当我们在局部作用域中,访问一个变量时,系统首先会在当前作用域中寻找变量var的声明语句,如找到则直接使用。反之,则继续向上一级作用域中寻找var的声明语句,如找到则直接使用,反之,继续向上一级作用域中去寻找…直到全局作用域,如找到则直接使用,如未找到则直接在全局作用域中声明该变量,我们把这种链式查询关系就称之为为作用域链!

        // 全局作用域: script标签包裹的内容就是一个作用域
        var abc = 123;
        // fn 中能访问到的变量由那些:
        // 1 自身定义的变量
        // 2 上一级作用域中的变量(全局作用域)
    
        // foo 中能访问到的变量由那些:
        // 1 自身定义的变量
        // 2 函数fn中的变量
        // 3 全局作用域中的变量
        function fn() {
            var a = 456;
    
            function foo() {
                var num = 123;
    
                // f的作用域链: f作用域 -> foo作用域 -> fn作用域 -> 全局作用域
                function f() {}
            }
            foo();
            // console.log(num);
        }
    

    注意

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

    相关文章

      网友评论

          本文标题:关于作用域链

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