js中的this指向和如何去改变this指向:call、apply、bind

1、this指向

● this是js的一个关键字,每一个函数内部都有一个关键字是this;

重点:函数内部的this只和函数的调用方式有关系,和函数的定义没有关系

this:谁调用我,this就指向谁(除了es6箭头函数)

●this在函数中的使用:this => window

  <script>
        function fn (){
            console.log(this)
        }
        fn()
  </script>

结果:window 

● this在对象中的使用:this => 调用者

  <script>
        var obj = {
            name:"yiyi",
            test:function(){
                console.log("111",this.name)
            }
        }
        obj.test()
  </script>

结果:111   yiyi 

解释说明:this就是谁调用我,我就指向谁。现在图中this在test这个键里,然后是obj调用了这个函数,所以就是obj调用了this,所以这个this指向的就是对象obj,所以this.name就相当于obj.name;

● this在setTimeOut倒计时定时器和setInterval间隔定时器的运用:this => window

在定时器中function函数是window自动调用的,所以this指向的就是window

  <script>
        setTimeout(function(){
            console.log(11111,this)
        },2000)
        setInterval(function(){
            console.log(22222,this)
        },2000)
  </script>

结果: 

● 事件绑定中的this:this => 事件源

<body>
    <div id="box"></div>
    <script>
        box.onclick = function(){
            console.log(this)
        }
    </script>
</body>

结果:

 解释说明:这个this指的就是div标签;

2、改变this指向

● 改变this指向有三种方法:call、apply、bind

● 首先这两个对象的this指向的都在自己,

  <script>
        var obj1 = {
            name:"obj1",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        var obj2 = {
            name:"obj2",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        obj1.getName()
        obj2.getName()
  </script>

结果: 

● call改变this指向

  <script>
        var obj1 = {
            name:"obj1",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        var obj2 = {
            name:"obj2",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        // obj1.getName()
        // obj2.getName()
        obj1.getName.call(obj2)
  </script>

结果:

解释说明:结果是obj2,call的作用就是将obj1的this指向更改指向obj2 

● 上述代码obj1.getName.call(obj2)直接getName.call()了,这个getName后面并没有括号,所以并没有执行代码,所以call的功能是执行函数,并改变this指向为函数的第一个参数;

● apply和call的功能是一样的,都是执行函数,并改变this指向为函数的第一个参数;

● apply和call的区别是,call支持多个参数,apply只有两个参数,第一个参数是this要指向的对象,第二个参数是一个数组,而且当call有多个参数时,这个参数就成为了实参,函数里面就要传对应数量的形参,apply也一样。看下面代码演示:

  <script>
        var obj1 = {
            name:"obj1",
            getName : function(a,b,c){
                console.log("getName:",this.name)
                console.log("参数:",a,b,c)
            }
        }
        var obj2 = {
            name:"obj2",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        obj1.getName.call(obj2,1,2,3)
        obj1.getName.apply(obj2,[1,2,3])
  </script>

结果:

call:

 apply:

 ● bind改变this指向为函数的第一个参数,不会自动执行函数,但是会返回一个函数,支持多个参数和call一样

  <script>
        var obj1 = {
            name:"obj1",
            getName : function(a,b,c){
                console.log("getName:",this.name)
                console.log("参数:",a,b,c)
            }
        }
        var obj2 = {
            name:"obj2",
            getName : function(){
                console.log("getName:",this.name)
            }
        }
        var fun1 = obj1.getName.bind(obj2,1,2,3)
        console.log(fun1)
        fun1()//收到执行
  </script>

结果: 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌一一

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值