前几日帮人看段老代码,for 循环里往数组塞了一排函数,本意是每个函数记住自己的下标,回头依次调,该吐 0、1、2……结果一跑,齐刷刷全是末位那个数。那人盯着屏幕愣了半天,我也跟着发了一阵呆。
道理其实不复杂,就是容易在脑子里打滑:循环里造的闭包,抓的是变量的引用,不是那一刻的快照。等循环跑完,变量早变成了终值,中间那些状态从没被谁存下来。话说回来所有函数回头去读,读到的都是同一份最后的记忆。
改起来也轻巧,把 var 换成 let,每次迭代自有一份绑定;或者塞个 IIFE 把当下的值递进去;嫌麻烦的直接 map 生成,干脆利落。我觉得吧这坑不疼,就是阴,像旧信箱里攒了一摞寄错人的信。