关于作用域链

作用域

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


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


需要注意的是,函数内部声明变量的时候,一定要使用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);
    }

注意

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

你可能感兴趣的:(关于作用域链)