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

为什么JavaScript对象声明过程中可直接引用对象自身?

为什么JS对象字面量内部可以引用即将赋值的变量名?

这个现象是JS的变量提升+函数延迟求值两个机制共同作用的结果,核心逻辑如下:

  • 首先是var的变量提升机制:JS在执行当前作用域的代码前,会先扫描所有var声明的变量,将其注册到作用域的变量环境中,初始值为undefined。因此在执行对象字面量的求值逻辑时,object这个标识符已经是合法存在的,不会抛出ReferenceError。
  • 其次是函数内的变量是延迟求值的:你在对象字面量中给func赋值的是箭头函数,函数内部的console.log(object)逻辑不会在对象创建、函数定义阶段执行,只有当你主动调用object.func()时,才会沿着作用域链查找object变量的值。此时赋值操作已经完成,object已经指向刚刚创建完成的对象,因此可以正常输出对象内容。

如果你的代码是直接在对象属性值顶层引用object,而非放在函数里,结果就会是undefined,因为此时求值阶段赋值还没完成:

var object = {
  prop1: "Prop 1",
  prop2: object // 此时object还没完成赋值,值为undefined
}
console.log(object.prop2) // 输出undefined

你给出的两段代码输出结果一致,但底层逻辑完全不同:

  • 箭头函数写法是在调用时查找作用域中的object变量,如果你后续修改了object变量的指向,输出结果会跟着变:
var object = {
  func: _ => console.log(object)
}
const oldObj = object
object = {}
oldObj.func() // 输出空对象{},因为此时object变量已经指向新对象
  • 普通函数this写法是基于调用时的绑定规则,作为对象方法调用时this指向调用对象,和外部object变量无关:
var object = {
  func: function() { console.log(this) }
}
const oldObj = object
object = {}
oldObj.func() // 输出原来的对象,因为this绑定的是调用者oldObj

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:06:01