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

JavaScript Counter函数中getCount与直接访问count结果差异疑问

核心原因:基础类型赋值是值拷贝,二者指向不同存储单元

你遇到的差异本质是JS的基础类型值传递规则和闭包作用域绑定规则共同作用的结果,具体执行逻辑如下:

  • 首先count是Number类型,属于JS基础类型,所有基础类型的赋值都是值拷贝,不会传递引用
  • 调用Counter()函数时,首先在函数私有作用域内创建了局部变量count,初始赋值为0
  • inc、dec、getCount三个是闭包函数,它们的作用域链绑定的是Counter函数私有作用域里的count变量,后续这三个函数读写的永远是这个作用域内的count
  • 构造返回对象时,count: count的赋值操作是「把当前作用域内count的值(也就是初始的0)复制一份,赋值给返回对象的count属性」,此时返回对象的count属性和函数作用域内的count变量已经是两个完全独立的存储单元,没有任何关联
  • 后续调用counter.inc()修改的是闭包绑定的作用域内的count,不会影响到返回对象上的count属性,因此就出现了二者返回值不一致的情况

验证示例:如果是引用类型赋值,二者就会同步

如果把count改成引用类型,赋值时传递的是内存地址,二者就会同步变化,代码如下:

function Counter() {
  let count = { value: 0 }
  
  function inc() {
    count.value += 1
  }
  
  function getCount() {
    return count.value
  }
  
  return { getCount, inc, count }
}

const counter = Counter()
counter.inc()
counter.inc()

console.log(counter.getCount()) // 2
console.log(counter.count.value) // 2,此时二者值同步

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:06:04