执行上下文

预备知识:

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.先执行完删除
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容