请问,下面这段代码中this换成oTd[i]怎么就出问题了?什么原理呢?
for (i=0;i<oTd.length;i++){
oTd[i].onclick=function(){
var oParent=this.parentNode;
oParent.style.backgroundColor="red";
因为你需要在事件内使用事件外的循环变量i。
当事件触发时,那个循环早就结束了,那时的i的值已经是循环最大值加1了。
所以需要用一些方式保存住当前循环的i的值。
方案一:用闭包保存住当前循环的i的值
for (var i = 0; i < arr.length; i++) {
(function(i){
arr[i].onclick = function () {
alert(i);
}
})(i);
}
方案二:用let块作用域变量
for (var i = 0; i < arr.length; i++) {
let k = i;
arr[i].onclick = function () {
alert(k);
}
}
oTd[i] 里面存的是啥?
你这里换成oTd[i]之后,i变量提升了,这个i已经是oTd.length+1了,因此是有问题的,最简单的解决办法就是,在i前面,使用let声明,for (let i=0;i<oTd.length;i++); 关于变量提升,你可以看看这篇文章https://www.jianshu.com/p/c92b4853d7ad