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

修改JS函数返回的container.data未变更内部data变量的原因求解

底层原因分析

这一现象本质是JavaScript的引用类型赋值规则和变量重新赋值的作用范围共同导致的,执行流程拆解如下:

  • 当test函数初始化运行时,会先在函数作用域内创建局部变量data,指向一个空对象的内存地址,我们暂记为地址A。返回值中container的data属性使用了对象简写语法,等价于data: data,也就是把局部变量data存储的地址A复制赋值给了container.data,此时两者指向同一个空对象。
  • 调用update()时,函数内部执行了data = {},这是给局部变量data重新赋值了一个全新的空对象,局部data的指向会变更为新的内存地址地址B。这个操作只会修改函数内部局部变量本身的引用指向,完全不会影响外部container.data的指向,container.data仍然指向最初的地址A。
  • 后续执行container.data.test = { result: 'test' }时,修改的是地址A对应对象的属性;而run函数打印的是函数内部局部变量data现在指向的地址B对应的对象,这个对象从始至终都没有被修改过,自然输出空对象。

如果希望container.data和函数内部的data始终保持同步,修改update逻辑即可:不要直接给data重新赋值整个新对象,而是清空原有对象的属性,保持引用地址不变:

const update = () => {
  // 清空原有对象的所有属性,不修改引用地址
  Object.keys(data).forEach(key => delete data[key])
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:57:01