简单理解执行上下文

108 阅读1分钟

对于每个执行上下文,都有三个重要属性:

  • 变量对象(Variable object,VO)
  • 作用域链(Scope chain)
  • this

废话不多说上代码

console.log(foo);

function foo(){
    console.log("foo");
}

var foo = 1;

JavaScript发现了一段可执行代码(executable code),准备创建对应的执行上下文(execution context):

在此之前

因为JavaScript的函数提升特性,将代码等量变换为:

function foo(){ //函数提升
    console.log("foo");
}
console.log(foo);
var foo = 1;

又因为JavaScript的变量提升特性,将代码等量变换为

function foo(){// 函数提升
    console.log("foo");
}
var foo;// 变量提升
console.log(foo);
foo = 1;

当javaScript扫描到console.log(foo)时,执行代码之前,先进入执行上下文(execution context)

因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。

VO = {
    foo: reference to function foo(){},
    // 变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。被忽略
    ~foo:undefined
}

执行代码console.log(foo),查找到了VO中的foo,输出结果

接着执行foo = 1,执行之后,VO为

VO = {
    foo: 1
}

顺序:函数提升>变量提升