解决回调函数中this的指向问题

this指向的三种情况

1. obj.fun()     fun 中的 this->obj ,自动指向.前的对象
2. new Fun()   Fun 中的 this->正在创建的新对象,new 改变了函数内部的 this 指向,导致 this 指向实例化 new 的对象
3. fun() 和匿名函数自调    this 默认->window,函数内部的 this,this 默认是指向 window 的

在回调函数中的this可能不是你想要的对象,这时候就要需要绑定。可以利用 bind、 call、 apply 可以实现,也可以用ES6的箭头函数解决(箭头函数内的this自动指向了回调函数外层的 this)
 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>解决回调函数中this的指向问题</title>
<body>
</body>

    <script>

        // bind call apply 都可以实现
        //也可以用ES6的箭头函数解决
        function ObjTest()
        {
            this.say = function()
            {
                console.log("say hello")
            }

            setTimeout(function(){
                console.log("this is ObjTest :",this);
            }.apply(this),2000)

            setTimeout(function(){
                console.log("this is window : ",this);
            },2000)

            //利用箭头函数实现
            setTimeout( () =>{
                console.log("this is ObjTest(箭头函数)  : ",this);
            },2000)

            return this;
        }

        let otest = new ObjTest()
        otest.say();

        setTimeout(function(){
            console.log("this is otest :",this);
        }.bind(otest),2000)

        setTimeout(function(){
            console.log("this is window :",this);
        },2000)
		
    </script>
</html>

结果如下:

 

当然你可以在外面定义一个变量,直接在回调函数里面使用这个变量

let otest = new ObjTest()
        otest.say();

        setTimeout(function(){
            console.log("this is otest :",otest);
        },2000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值