深刻理解javascript系列(五):变量对象(VO)2

在系列(四)中,我留下了本身的疑惑,其实我是有答案的。答案就是遵循"忽略原则"。若是不忽略整个运行机制想必会乱套。MMP浏览器

继续个人变量对象笔记记录...bash

为了更加深入地理解变量对象,这回咱们结合一些实例来探讨。微信

5.1  实例分析函数

//demo01
function test() {
    console.log(a);
    console.log(foo());

    var a = 1;
    function foo() {
        return 2;
     };
}
test();复制代码

当运行test函数时,咱们说他对应的执行上下文被激活(建立)。咱们知道执行上下文的生命周期有两个阶段(建立阶段和执行阶段)。在这里咱们用以下形式来表达这个过程:学习

//建立过程
testEC = {
    VO: {},            //变量对象
    scopeChain: [],    //做用域链
    this: {}
}
//学习js是渐进加强的过程,因此这里对做用域链和this不作过多解释,目前咱们只关注变量对象(VO)

VO = {
    arguments: {...},
    foo: <foo reference>  //函数应用
    a: undefined
}复制代码

在call stack中,若是当前执行上下文处于call stack的栈顶,则意味着这个执行上下文出于激活状态,此时变量对象称之为活动对象(AO, Activation Object)。活动对象包含变量对象的全部属性,而且此时全部的属性都已完成赋值(在这里就须要注意了:变量赋值是发生在执行上下文的执行阶段),除此以外,活动对象还包含了this指向。ui

//执行阶段
VO -> AO
AO = {
    arguments: {},
    foo: <foo reference>,
    a: 1,
    this: window
}复制代码

所以上面例子实际执行顺序为:this

function test() {
    function foo() {
        return 2;
    }
    var a = undefined;
    console.log(a);
    console.log(foo());
    a = 1;
}
test();复制代码

下面咱们再来看个例子巩固一下:spa

//demo02.js
function test() {
    consloe.log(foo);
    console.log(bar);
    
    var foo = 'Hello';
    console.log(foo);
    var bar = function() {
        return 'world';
    }
    
    function foo() {
        return 'hello'
    }

}

test();复制代码

运行test函数时,对应的上下文开始建立,能够用以下形式来表达这个过程:code

//建立过程
testEC = {
    VO: {
        arguments: {},
        foo: <foo reference>,
        bar: undefined
    },                     //变量对象
    scopeChain: [],        //做用域链
    this: {}
}

//执行阶段
VO -> AO
AO = {
    arguments: {...},
    foo: 'Hello',
    bar: <bar referencer>,
    this: window
}复制代码

融合整个知识点,相信您变量对象已经掌握了。对象

5.2  全局上下文的变量对象

以浏览器为例,全局对象为window对象。

全局上下文的变量对象有一个特殊的地方,即他的变量对象就是window对象,并且全局上下文的变量对象不能变成活动对象。

除此以外,全局上下文的生命周期与程序的生命周期一致,只要程序运行不结束(好比关掉浏览器窗口),全局上下文就会一直存在,其它全部的执行上下文都能直接访问全局上下文的属性(这一点很重要)。

到这里,个人变量对象学习过程也就结束了。

记住:执行上下的生命周期、变量对象->活动对象、全局上下文的特殊性。

这些都是我以往的学习笔记。若是您看到此笔记,但愿您能指出个人错误。有这么一个群,里面的小伙伴互相监督,坚持天天输出本身的学习心得,不输出就出局。但愿您能加入,咱们一块儿终身学习。欢迎添加个人我的微信号:Pan1005919589

相关文章
相关标签/搜索