关于this关键字请教

请问,下面这段代码中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