这已经是经典 closure “bug”了,凡是支持在 closure 里访问 mutable 变量的语言,都可以构造出这种“bug”,比如 c#、python 等等
1.最简单的解决方案,不要在 for 循环体的 closure 使用 i,绝大多数情况不需要。尤其 NodeList 这种支持 .forEach 的,连 for 都是多余的
2.es6 非要用 for 的解决方案:for (let i = 0; ...) ...
3.用 lodash:_.forEach(objects, (obj, index) => ...)
4.es6 之前需要套一层 iife:
foo.addEventListener('bar', (function (ii) {
return function (e) {
console.log(ii);
};
})(i));
【 在 Splunk (每天挖坟墓,不是你蹲就是我蹲) 的大作中提到: 】
: 大侠,我把代码稍微改了一下,就实现了
: 但是同样的var变量,为什么lis就可以 lis[i]不可以?
: 请看代码
: ...................
--
FROM 125.236.132.*