window.onload = function(){
var body = document.getElementsByTagName('body')[0];
var btn = document.getElementsByTagName('button');
var array = ['one','two','three','four','five'];
for(var num = 0;num<btn.length;num++) {
btn[num].onclick = function () {
console.log(num)
}
}
}
for(var num = 0;num<btn.length;num++) {
let n = num; //let关键字生成的变量只会在当前{}代码块中,不会产生变量提升现象
btn[num].onclick = function (e) {
console.log(n);
console.log(array[n])
}
}
问题的根源
变量提升现象
因为onclick是在浏览器触发其事件的时候才会执行,因此他是一个异步执行的函数,无论如何都会在这段代码执行完成之后才会执行,而此时javascript已经完成了这段代码的for循环,num的值也早就变成了
btn.length-1
了,这种现象叫做变量提升解决方法
方法1,使用bind方法产生一个绑定参数而且延时执行的方法
-方法2,创建一个创建一个新的函数并用其作用域参数保存num值,防止变量提升,(闭包)
-方法3,let关键字,可以在nodejs用于解决变量提升,支持let的浏览器也可以一战(MS Edge、Chrome等)
循环+闭包
事件代理