js es5应对来计数的循环变量泄露为全局变量使用闭包:
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = function(){
console.log(i)
}
}
本意点击不同".clickBox"输出不同的 i 值,但是最后输出的都是最后一个值;
闭包写法:
function iteratorFactory(i){
var onclick = function(e){
console.log(i)
}
return onclick;
}
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = iteratorFactory(i)
}
es6 出现了 let 方法, 只在代码块内生效,不需闭包也能实现循环计数.
var clickBoxs = document.querySelectorAll('.clickBox')
for (let i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = function(){
console.log(i)
}
}