对于每个执行上下文,都有三个重要属性:
- 变量对象(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
}
顺序:函数提升>变量提升