You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象字面量及其方法的执行上下文:创建、执行阶段解析与赋值时机问询

对象字面量的执行上下文与赋值时机解析

示例代码

var objLiteral = {
    name: 'Kumar',
    myNameIs: function() {
        return this.name;
    }
};
objLiteral.name = 'Arvind';
objLiteral.myNameIs(); // returns Arvind

我的疑问与现有理解

我理解let、const及函数的全局执行上下文与函数执行上下文机制,但对对象字面量的相关机制尚不清晰,能否有人解析上述代码的创建阶段与执行阶段的运行流程?

我的现有理解如下:

  • 创建阶段:
    1. objLiteral对应的空对象{}被存入内存,在程序结束前不会被垃圾回收,可随时访问。
    2. 为属性name分配内存地址,并向对象返回指针,以便执行阶段查找。
    3. 为方法myNameIs分配内存地址,并向对象返回指针,以便执行阶段查找。
  • 执行阶段:
    1. 通过追踪之前存储的内存地址,将objLiteral.name的值设为'Arvind'。
    2. 调用objLiteral.myNameIs()时,利用对象的内存地址和方法myNameIs的指针创建函数执行上下文,this的值由调用该方法的对象决定,因此this==objLiteral。
    3. 由于this与objLiteral指向同一对象,获取值的内存路径与objLiteral.name一致,最终返回'Arvind'。

请问变量objLiteral何时被赋值(即获得对象的引用)?是在创建阶段还是执行阶段?


解析与解答

首先明确核心结论:objLiteral的声明提升发生在全局执行上下文的创建阶段,但它获得对象引用的赋值操作是在执行阶段。下面分阶段拆解完整流程:

1. 全局执行上下文 - 创建阶段

这一阶段仅完成「声明提升」和基础初始化:

  • 扫描到var objLiteral声明,将该变量加入全局变量对象,初始值设为undefined。
  • 此阶段不会创建对象字面量本身,内存中只有一个值为undefined的objLiteral变量,不存在所谓的空对象或属性内存分配。

2. 全局执行上下文 - 执行阶段

按代码顺序逐行执行逻辑:

  • 执行var objLiteral = { ... }行:
    1. 在内存中开辟空间,创建包含name: 'Kumar'属性和myNameIs函数的完整对象(函数会单独占用内存空间,对象内存储的是指向该函数的指针)。
    2. 将这个对象的内存引用赋值给objLiteral变量,此时objLiteral才从undefined变为指向目标对象的引用。
  • 执行objLiteral.name = 'Arvind':通过objLiteral的引用找到内存中的对象,修改其name属性的值为'Arvind'。
  • 执行objLiteral.myNameIs():
    1. 创建函数执行上下文,由于是通过objLiteral调用方法,函数上下文的this绑定为objLiteral指向的对象。
    2. 函数内部执行return this.name,通过this找到对象的name属性,返回'Arvind'。

对现有理解的修正

你之前认为创建阶段就生成空对象并分配属性内存的说法不准确。对象字面量的创建、属性与方法的内存分配,都是在执行阶段处理var objLiteral = { ... }这一行时才完成的,创建阶段仅完成变量的声明与undefined初始化。


内容的提问来源于stack exchange,提问作者Kumar Desai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:23:20