var a = [];
for(var i = 0;i<10;i++){
a[i] = function(){
console.log(i)
}
a[0]()//0,1,2,3,4,5,6,7,8,9;console.log(a[i])
}
a[0]()//10
console.log(a[i])你会发现,打印出来的全部是function(){console.log(i)},也就是说在函数执行前,每个函数的i并没有解析
但是当在外面执行的时候,其实函数执行的时候i已经变成了10,当函数console.log(i)的时候i是10;那么你也许会问明明循环中已经定义好了a[6]= function(){console.log(6)}嘛,其实不是这样的,当在函数执行之前是不会读取函数体中的变量的,也就是说,循环了那么多次,定义了那么多的函数,函数体中的变量一直是i,只有在调用的时候才会寻找i的值
当在里面执行的时候,i是随着循环走的,每循环一次i就变化一次,所以在里面执行的时候函数中的i就是当前循环的i的值,这也就可以解释为什么在函数体内,a[0]()可以有那么多的值,因为还是上面的道理,当一次循环执行到a[0]()的时候,这个时候就开始为函数寻找函数里面的值到底是谁,结果自然而然就是当前循环的i的值嘛,当再一次接着循环的时候还是一样的道理.....