<body>
<button>Button0</button>
<button>Button1</button>
<button>Button2</button>
<button>Button3</button>
<button>Button4</button>
</body>
var btns = document.getElementsByTagName('button');
for(var i = 0, len = btns.length; i < len; i++) {
// 1
// btns[i].onclick = function(){// alert(i);
// }
//2
(function(i){btns[i].onclick = function(){
alert(i);
}
}(i))
}
1场景时触发每个按钮都是弹出 5 ;因为触发每个按钮时循环都执行完了,所以都是5
2场景会逐一弹出相应的 i 值
因为在闭包的作用下,定义事件函数的时候,每次循环的i值都被封闭起来,这样在函数执行时,会查找定义时的作用域链,这个作用域链里的i值是在每次循环中都被保留的,因此点击不同的button会alert出来不同的i。