对象字面量及其方法的执行上下文:创建、执行阶段解析与赋值时机问询
对象字面量的执行上下文与赋值时机解析
示例代码
var objLiteral = { name: 'Kumar', myNameIs: function() { return this.name; } }; objLiteral.name = 'Arvind'; objLiteral.myNameIs(); // returns Arvind
我的疑问与现有理解
我理解let、const及函数的全局执行上下文与函数执行上下文机制,但对对象字面量的相关机制尚不清晰,能否有人解析上述代码的创建阶段与执行阶段的运行流程?
我的现有理解如下:
- 创建阶段:
objLiteral对应的空对象{}被存入内存,在程序结束前不会被垃圾回收,可随时访问。- 为属性
name分配内存地址,并向对象返回指针,以便执行阶段查找。 - 为方法
myNameIs分配内存地址,并向对象返回指针,以便执行阶段查找。
- 执行阶段:
- 通过追踪之前存储的内存地址,将
objLiteral.name的值设为'Arvind'。 - 调用
objLiteral.myNameIs()时,利用对象的内存地址和方法myNameIs的指针创建函数执行上下文,this的值由调用该方法的对象决定,因此this==objLiteral。 - 由于
this与objLiteral指向同一对象,获取值的内存路径与objLiteral.name一致,最终返回'Arvind'。
- 通过追踪之前存储的内存地址,将
请问变量objLiteral何时被赋值(即获得对象的引用)?是在创建阶段还是执行阶段?
解析与解答
首先明确核心结论:objLiteral的声明提升发生在全局执行上下文的创建阶段,但它获得对象引用的赋值操作是在执行阶段。下面分阶段拆解完整流程:
1. 全局执行上下文 - 创建阶段
这一阶段仅完成「声明提升」和基础初始化:
- 扫描到
var objLiteral声明,将该变量加入全局变量对象,初始值设为undefined。 - 此阶段不会创建对象字面量本身,内存中只有一个值为
undefined的objLiteral变量,不存在所谓的空对象或属性内存分配。
2. 全局执行上下文 - 执行阶段
按代码顺序逐行执行逻辑:
- 执行
var objLiteral = { ... }行:- 在内存中开辟空间,创建包含
name: 'Kumar'属性和myNameIs函数的完整对象(函数会单独占用内存空间,对象内存储的是指向该函数的指针)。 - 将这个对象的内存引用赋值给
objLiteral变量,此时objLiteral才从undefined变为指向目标对象的引用。
- 在内存中开辟空间,创建包含
- 执行
objLiteral.name = 'Arvind':通过objLiteral的引用找到内存中的对象,修改其name属性的值为'Arvind'。 - 执行
objLiteral.myNameIs():- 创建函数执行上下文,由于是通过
objLiteral调用方法,函数上下文的this绑定为objLiteral指向的对象。 - 函数内部执行
return this.name,通过this找到对象的name属性,返回'Arvind'。
- 创建函数执行上下文,由于是通过
对现有理解的修正
你之前认为创建阶段就生成空对象并分配属性内存的说法不准确。对象字面量的创建、属性与方法的内存分配,都是在执行阶段处理var objLiteral = { ... }这一行时才完成的,创建阶段仅完成变量的声明与undefined初始化。
内容的提问来源于stack exchange,提问作者Kumar Desai
相关产品推荐
相关产品推荐

