函数表达式存储闭包为快照还是引用?JavaScript点击计数器闭包运行疑问
嘿,这俩问题问到点子上了!咱们掰开揉碎了说:
问题1:函数表达式保存闭包时,是快照还是引用形式?
闭包绝对不是存储变量的快照,它保留的是对自己诞生时所在词法环境的引用。换句话说,闭包就像拿着一把能打开原作用域的钥匙,随时能进去访问甚至修改里面的变量,而不是攥着一份固定不变的拷贝。
问题2:为什么点击计数器里的count能被持续修改?
先把你的代码贴出来方便对照:
function xyz(){ let count=0; function abc(){ return ++count; } return abc; } var store = xyz(); document.addEventListener('click',()=>{ console.log(store()); });
咱们一步步捋:
- 当你调用
xyz()时,它会创建一个专属的局部作用域,里面住着count(初始值0)和abc函数。 - 当
xyz()返回abc的时候,这个函数并没有把count的“照片”带走——它带走的是对xyz这个作用域的引用。 - 你把返回的
abc存在store里,相当于store就是abc的“别名”。 - 每次点击触发
store(),其实就是在调用abc(),它会直接找到那个同一个count变量,把它加1再返回。
根本不存在什么“不可变快照”——这个count是一直活在xyz的作用域里的,闭包abc一直能通过引用找到它,自然能持续修改啦。
内容的提问来源于stack exchange,提问作者sayandcode
相关产品推荐
相关产品推荐

