预备知识:
1.栈stack:先进后出
栈是类似于数组的一种数据结构。
2.对象引用:不是存放的数据,是地址,地址指向内存空间,内存空间里面存有数据
执行上下文概念:
执行上下文:某个函数或全局代码的执行环境,该环境中包含执行代码需要的所有信息。
可以简单的理解为:执行上下文是一个对象,该对象中包含了执行代码所需要的信息。
当执行一个函数时,需要建立执行上下文,建立后才开始正式执行。
call stack(执行上下文栈):组织管理程序运行过程中的执行上下文。
"只有"'调用'函数才能执行上下文(重点),执行栈管理执行上下文。
执行上下文的内容:
1.VO:variable object,变量对象,存放的是函数或全局代码执行过程中需要用到的局部变量
2.scope:作用域
3.this
VO:
想象:
{
vo:{},
scope:{},
this:{}
}
vo:是一个对象,调用函数或执行全局代码时创建,创建一个vo,需要经过三步:vo这也是变量声明提前的原因
1.确定函数形参的值(包括arguments对象)
2.确定函数中所有的函数字面量声明(function bar(){}),不是函数表达式
2.1 该函数必须是字面量声明,也就是function bar(){},不能是函数表达式,字面量声明提取到vo执行后,可以认为该声明式,不存在了。
2.2 如果当前vo中出现同名属性,直接覆盖。
3.确定函数中所有的变量声明(var),将其提取到上下文中,值为undefined;
3.1如果当前vo中出现同名属性,忽略;
测试题:
function foo(a,b){
console.log(a,b,arguments);//a-fn,4, [a-fn,4]
bar();
function bar(){
console.log("bar");//bar
}
function a(){
}
var i = 10;
var j = 11;
var k = 100;
}
foo(3,4);
执行上下文建立过程:
{
vo(foo):{
a:3,//会被a-fn覆盖,--> fn
b:4,
arguments:{},//伪数组也会被覆盖
bar:fn,
i:undefined,
j:undefined,
k:undefined
vo(bar):{//删除
console.log();//1.先执行完删除
}
}
}
网友评论