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

关于JavaScript闭包的疑问:修改属性后foo()结果不符预期

为什么修改obj3.myA后obj3.foo()返回6而不是3?

嘿,这个问题核心是对闭包捕获的对象有点误解,咱们一步步拆解来看:

首先看你的这段代码:

var MyObject3 = function (a, b) { 
  var obj = { myA : a, myB : b } ; 
  obj.foo = function () { return obj.myA + obj.myB ; } ; 
  obj.bar = function (c) { return obj.myA + c ; } ; 
  return obj ; 
} ;

你说obj.foo和obj.bar是闭包,这点完全没错——它们确实捕获了外部函数MyObject3作用域里的obj变量。但关键细节是:它们捕获的是obj这个对象的引用,而不是一开始赋值的a和b的固定值。

当你执行obj3 = MyObject3(1, 2)时,函数内部的obj对象被直接返回给了obj3,这意味着obj3和函数里的obj指向的是内存中同一个对象。所以你修改obj3.myA = 4的时候,本质上就是在修改那个被闭包捕获的obj对象的myA属性。

那调用obj3.foo()时,它会去读取当前obj(也就是obj3)的myA和myB——也就是4和2,加起来自然是6,而不是你预期的1+2=3。

如果想要让foo始终返回最初的a+b结果,你得让闭包直接捕获a和b这两个原始值,而不是obj对象的引用。比如改成这样:

var MyObject3 = function (a, b) { 
  var obj = { myA : a, myB : b } ; 
  obj.foo = function () { return a + b ; } ; // 直接捕获函数参数a、b的初始值
  obj.bar = function (c) { return a + c ; } ; 
  return obj ; 
} ;

这时候你再修改obj3.myA = 4,obj3.foo()就会返回3了——因为闭包捕获的是函数调用时a和b的固定值,不受后续对象属性修改的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:20