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

JavaScript初始化map时能否引用同map内已定义的属性值?

核心原因

和“常量值不可变更”没有关系,是JavaScript两个基础执行规则导致的:

  • 第一,对象字面量的{}不会创建独立作用域,写在属性值位置的表达式,执行上下文完全取决于外层作用域。如果你这段代码写在全局,这里的this指向全局对象(浏览器环境是window,Node.js环境是globalThis),和你正在创建的对象没有任何关联;如果写在函数内部,this指向的是函数运行时绑定的上下文,同样不是正在构建的目标对象。
  • 第二,对象初始化的固定顺序是先逐行计算所有属性的取值,所有属性计算完成后才会生成完整的对象实例,最后再把这个实例赋值给左边的map常量。也就是说你在计算URL属性值的时间点,目标对象还没创建完成,map常量也还没完成赋值,根本不可能从一个不存在的对象上读取PAGE_ID属性。哪怕你去掉this直接写PAGE_ID也会直接抛ReferenceError——对象属性是挂载在最终生成的对象实例上的,不会注册到当前执行作用域,外层作用域根本找不到名为PAGE_ID的变量。

你可以直接运行示例代码验证,最终map.URL的值会是https://someUrl.com/?pageId=undefined,本质就是this.PAGE_ID读取的是全局对象上的PAGE_ID属性,而全局并没有定义这个值,拿到的就是undefined。

可选实现方案

如果要实现同对象内关联属性的定义,有两种常用写法:

  1. 初始化时固定值(符合常量不可变的要求)
    先把公共值提取为临时常量,再赋值给对象属性,这种写法下URL在对象创建完成后就是固定字符串,不会随后续属性修改变化:
const PAGE_ID = '<some_string_id_value>';
const map = {
  PAGE_ID,
  URL: `https://someUrl.com/?pageId=${PAGE_ID}`
};
  1. 访问时动态计算
    如果不想拆分出单独变量,可以给URL定义getter访问器,注意这种写法下URL不会在初始化时固定值,每次访问都会重新计算,如果后续修改map.PAGE_ID,返回的URL也会同步变化,不适合纯常量场景:
const map = {
  PAGE_ID: '<some_string_id_value>',
  get URL() {
    return `https://someUrl.com/?pageId=${this.PAGE_ID}`
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:33:08