设置了id为0,1,2,3的四个div,鼠标移入弹出它们的id值,以下代码可以顺利得出每次循环的i值
document.body.onclick=function(){
for(var i=0;i<4;i++){
!function(i){
var o = document.getElementById(i);
o.onmouseover=function(){
alert(i);
}
alert(i);
}(i);
}
}
但是修改成这样后i的值一直为4 , 听一些人说是初始化阶段的问题 ,我是一个初学者 , 原理机制能请大牛剖析一下吗?谢谢!
document.body.onclick=function(){
for(var i=0;i<4;i++){
var o = document.getElementById(i);
o.onmouseover=function(){
alert(i);
}
alert(i);
}
}
建议你去看看闭包吧。
先说第二种方式,通过循环给每个元素绑定mouseover 事件,循环结束,i 值为4. onmouseover 指向一个匿名函数,当事件发生,显示弹框,i 是最后的i,而不是绑定时的值。原因是在函数内定义函数,会形成闭包,内部函数可以访问包含函数内的变量(这里是i),但是内部函数访问的外部函数执行结束后的i值,而不是绑定那一刻的值,因为那一刻,事件还未发生。
对于第一种方式 mouseover 处在一个内部的匿名函数中,并且这个匿名函数直接被调用,由于函数已经执行完毕,所以i值就是那一刻的值,其内部的mouseover事件处理程序访问到也就是这个值。
总结一句就是 闭包使得内部函数可以访问外部函数的变量,具体变量的值是什么取决于内部函数执行的时刻。