经典闭包
for(var i = 0; i < 5; i++){ oLi[i].onclick = function(){ console.log("You clicked element # " + i); // 输出全为5 } }
1.使用立即执行函数表达式
for(var i = 0; i < 5; i++){ (function(i){ oLi[i].onclick = function(){ console.log("You clicked element # " + i); } })(i) }
2.使用立即执行函数表达式(IIFE)再创建一个闭包
for(var i = 0; i < 5; i++){ oLi[i].onclick = (function(i){ return function() { console.log('You clicked element #' + i); } })(i) }
3.将变量 i 保存给在每个段落对象 li 上
for(var i = 0; i < 5; i++){ oLi[i].index = i; oLi[i].onclick = function(){ console.log("You clicked element # " + this.index); } }
4.for循环的闭包(加一层闭包,i以局部变量形式传递给内存函数)
for(var i = 0; i < 5; i++){ (function(){ var item = i; oLi[i].onclick = function(){ console.log("You clicked element # " + item); } }()) }
5.ES6 中的let
for(let i = 0; i < 5; i++){ oLi[i].onclick = function(){ console.log("You clicked element # " + i); } }
5.使用立即执行函数表达式(IIFE)再创建一个闭包
var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
nodes[i].addEventListener('click', (function(i) {
return function() {
console.log('You clicked element #' + i);
}
})(i));
}
6.另一个解决方案不使用IIFE,而是将函数移到循环的外面
function handlerWrapper(i) { return function() { console.log('You clicked element #' + i); } } var nodes = document.getElementsByTagName('button'); for (var i = 0; i < nodes.length; i++) { nodes[i].addEventListener('click', handlerWrapper(i)); }