javascript 变量对象

作者: 淘淘笙悦 | 来源:发表于2018-06-11 22:41 被阅读12次

我在文章《javascript 执行上下文》中介绍了 javascript 代码在执行时,会相应地创建对应执行上下文并将其入栈出栈的过程。
每个执行上下文会包含三个重要属性,分别是变量对象(Variable Object,VO)作用域链(Scope Chain)this 指向

本篇主要详细介绍变量对象的生成过程。

我们已经知道,在执行上下文的创建阶段会生成变量对象,生成变量对象主要有以下三个过程:

  1. 检索当前上下文中的参数。该过程生成 arguments 对象,建立以形参变量名为属性名,形参变量值为属性值的属性;
  2. 检索当前上下文中的函数声明。该过程建立以函数名为属性名,函数所在内存地址引用为属性值的属性;
  3. 检索当前上下文中的变量声明。该过程建立以变量名为属性名,undefined 为属性值的属性(如果变量名跟已声明的形参变量名或函数名相同,则该变量声明不会干扰已经存在的这类属性)。

我们可以通过以下伪代码来表示变量对象

VO={
    Arguments:{},
    Param_Variable:具体值,  //形参变量
    Function:<function reference>,
    Variable:undefined
},

当执行上下文进入执行阶段后,变量对象会变为活动对象(Active Object,AO)。此时原先声明的变量会被赋值。变量对象和活动对象都是指同一个对象,只是处于执行上下文的不同阶段
我们可以通过以下伪代码来表示活动对象

AO={
    Arguments:{},
    Param_Variable:具体值,  //形参变量
    Function:<function reference>,
    Variable:具体值
},

举个例子~
假设有一个 javascript 文件中包含如下代码

function fn1(a) {
    var b = 1;
    function fn2() {}
    var c = function() {};
}

fn1(0);

当 fn1 函数被调用时,fn1 执行上下文被创建(创建阶段),其变量对象如下所示

fn1Context={
    VO={
        Arguments:{
            0:0,
            length:1
        },
        a:0,
        b:undefined,
        fn2:<function fn2 reference>,
        c:undefined
    }
}

在 fn1 函数上下文的执行阶段,变量对象变为活动对象,原先声明的变量会被赋值,其活动对象如下所示

fn1Context={
    AO={
        Arguments:{
            0:0,
            length:1
        },
        a:0,
        b:1,
        fn2:<function fn2 reference>,
        c:<function express c reference>,
    }
}

对于全局上下文来说,由于其不会有参数传递,所以在生成变量对象的过程中只有检索当前上下文中的函数声明和检索当前上下文中的变量声明两个步骤。
在全局上下文中的变量对象(即全局对象)是我们熟悉的 window,通过该对象可以使用其预定义的变量和函数,在全局环境中所声明的变量和函数,也会成为全局对象的属性。

相关文章

  • 变量对象

    参考 JavaScript深入之变量对象深入理解JavaScript系列(12):变量对象(Variable Ob...

  • js归纳总结——各种思维导图

    javascript DOM操作 javascript windows对象 javascript变量 javasc...

  • JavaScript 作用域

    在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象...

  • JavaScript作用域

    在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象...

  • JavaScript基础

    JavaScript简介JavaScript变量JavaScript对象、函数JavaScript数字,字符串Ja...

  • javascript 变量对象

    我在文章《javascript 执行上下文》中介绍了 javascript 代码在执行时,会相应地创建对应执行上下...

  • JavaScript Window基础整理 - 1

    1 Window对象 所有JavaScript全局对象 函数以及变量均自动成为window对象的成员。 全局变量是...

  • JavaScript快速入门07-对象

    在 JavaScript 中,对象是非常重要的,对象也是一个变量,但对象可以包含多个值。JavaScript中将对...

  • javascript 课程学习笔记

    一、变量javascript变量命名:jquery对象:以$开头$.srapt(),以字母开头:$ == jque...

  • javaScript作用域

    作用域为可访问变量的集合。 在javaScript中,对象和函数同样也是变量, 在javaScript中作用域为可...

网友评论

    本文标题:javascript 变量对象

    本文链接:https://www.haomeiwen.com/subject/fnsmsftx.html