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

函数表达式存储闭包为快照还是引用?JavaScript点击计数器闭包运行疑问

嘿,这俩问题问到点子上了!咱们掰开揉碎了说:

问题1:函数表达式保存闭包时,是快照还是引用形式?

闭包绝对不是存储变量的快照,它保留的是对自己诞生时所在词法环境的引用。换句话说,闭包就像拿着一把能打开原作用域的钥匙,随时能进去访问甚至修改里面的变量,而不是攥着一份固定不变的拷贝。

问题2:为什么点击计数器里的count能被持续修改?

先把你的代码贴出来方便对照:

function xyz(){ 
  let count=0; 
  function abc(){ 
    return ++count; 
  } 
  return abc; 
}
var store = xyz();
document.addEventListener('click',()=>{ console.log(store()); });

咱们一步步捋:

  1. 当你调用xyz()时,它会创建一个专属的局部作用域,里面住着count(初始值0)和abc函数。
  2. 当xyz()返回abc的时候,这个函数并没有把count的“照片”带走——它带走的是对xyz这个作用域的引用。
  3. 你把返回的abc存在store里,相当于store就是abc的“别名”。
  4. 每次点击触发store(),其实就是在调用abc(),它会直接找到那个同一个count变量,把它加1再返回。

根本不存在什么“不可变快照”——这个count是一直活在xyz的作用域里的,闭包abc一直能通过引用找到它,自然能持续修改啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:02:33