var odiv=document.getElementsByTagName('div'); function divclick(obj){ obj.onclick=function(){ console.log(obj); } } for (var i = 0; i < odiv.length; i++) { divclick(odiv[i]); } //当执行点击函数时,还需要divclick函数,因此当循环结束时,divclick函数并不会被销毁,因此其作用域也被保留下来,因此正常输出 for (var i = 0; i < odiv.length; i++) { odiv[i].onclick=function(){ console.log(odiv[i]);//此时i已经变化了 } } //循环结束,绑定函数结束,函数自身、作用域、变量等都随之销毁,当执行onclick函数时,i值通过作用域链向上找,最后i作为全局变量且值为odiv.length+1,因此输出undefined for (var i = 0; i < odiv.length; i++) { odiv[i].onclick=function(){ console.log(this); } } //这里涉及到this的指向问题,this指向调用的对象,且this指向是在函数执行时才确定的,并不是在函数定义时确定的 //当点击事件触发函数时,this指向调用对象,而这里的调用对象正是odiv[i],因此正常输出