JS之作用域链

110 阅读1分钟

函数创建

函数在创建也就是代码写完的时候,系统就自动回给这个函数创建一个[[scope]]属性,会保存所有的父级VO到里面。

举个例子:

function foo() {
    function bar() {
        ...
    }
}

有两个函数创建了,所以每个都有自己的[[scope]]:

foo.[[scope]] = [
  globalContext.VO
];

bar.[[scope]] = [
    fooContext.AO,
    globalContext.VO
];

当函数激活也就是执行函数时,按分析阶段和执行阶段来分析。

举个例子:

var scope = "global scope";
function checkscope(){
    var scope2 = 'local scope';
    return scope2;
}
checkscope();

创建函数:

checkscope.[[scope]] = [
    globalContext.VO
];

函数执行:

  1. 分析阶段

把函数的[[scope]]复制到函数上下文去

checkscopeContext = {
    Scope: checkscope.[[scope]],
}

初始化AO,加入arguments,函数声明,变量声明:

checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: undefined
    },
    Scope: checkscope.[[scope]],
}

把AO放入作用域链Scope中去:

    checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: undefined
    },
    Scope: [AO, [[Scope]]]
}
  1. 代码执行阶段 顺序执行代码,修改AO的值
checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: 'local scope'
    },
    Scope: [AO, [[Scope]]]
}