this备份上下文

首先我们看一段代码

<div  id="all" class="all">
        <div id="box1" class="box"></div>
        <div id="box2" class="box"></div>
        <div id="box3" class="box"></div>
    </div>


  function setColorRed(){
            setTimeout(function(){  //延时器调用为windowd对象,window设置样式()
                this.style.backgroundColor = 'red';
            },2000)
        
        }

        let box1 = document.getElementById('box1');
        let box2 = document.getElementById('box2');
        let box3 = document.getElementById('box3');


        box1.onclick = setColorRed; //只要点击事件函数就会执行无需调用函数
        box2.onclick = setColorRed;
        box3.onclick = setColorRed;

这段程序最后执行会报错,因为是延时器调用的,最后this指向为window,window.样式肯定error。


改进

function setColorRed(){
            let self = this;
            setTimeout(function(){  //延时器调用为windowd对象,window设置样式()
                self.style.backgroundColor = 'red';
            },2000)
        
        }

        let box1 = document.getElementById('box1');
        let box2 = document.getElementById('box2');
        let box3 = document.getElementById('box3');


        box1.onclick = setColorRed; //只要点击事件函数就会执行无需调用函数
        box2.onclick = setColorRed;
        box3.onclick = setColorRed;

当点击事件函数执行的时候,this指向dom元素保留到self当中去,因为在延时器中this指向的是全局对象,用备份的this改变样式,而不是受到延时器this为全局对象所影响到.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值