2018-12-24


JavaScript作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象。即当前函数所在区域的变量声明和赋值

function add(a,b){

var sum = a + b;

return sum;

}

假设函数是在全局作用域中创建的,在函数a创建的时候,它的作用域链填入全局对象,全局对象中有所有全局变量,此时的全局变量就是变量对象。此时的作用域链只有一级,

如果是函数执行阶段,那么将其activation object(AO)作为作用域链第一个对象,第二个对象是上级函数的执行上下文AO,下一个对象依次类推。

add(4,5)

在函数运行过程中标识符的解析是沿着作用域链一级一级搜索的过程,从第一个对象开始,逐级向后回溯,直到找到同名标识符为止,找到后不再继续遍历,找不到就报错

例如

var x = 10;

function foo() {

    var y = 20;

    function bar() {

        var z = 30;

        console.log(x + y + z);

    };

    bar()

};

foo();

上面代码的输出结果为”60″,函数bar可以直接访问”z”,然后通过作用域链访问上层的”x”和”y”。此时的作用域链为:

此时作用域链(Scope Chain)有三级,第一级为ba,第二级为foo然后Global Object 

你可能感兴趣的:(2018-12-24)