• 改变this指向以及call apply bind的区别


    首先要说的是this,到底指向什么?

      可能你也听说过  函数谁调用 this就指向谁. 但是随着js的发展,this指向我们也是可以做更改的.

    先看一下简单的例子:

    var name = '小王',age=15,
      obj={
        name:'小张',
        age:18,
        say:function (){
          return '姓名'+this.name+'年龄'+this.age
        }
      }
      console.log(name,obj.name,obj.say())

    以上代码可能就比较好理解,运用谁调用指向谁的原理:

    首先say这个函数是谁调用的     obj

    那么obj里面是否有name和age属性   有

    然后就返回了    小王,小张,姓名小张年龄18

    这个应该没有问题,那么问题来了,我如果想让say里面的this指向window,该怎么做呢?

    你可能会说我们有bind,call,apply可以使用,但是还有一种方法,就是我们所说的谁调用指向谁,那我们能直接让window调用say吗?当然也是有方法实现的,代码如下

    var name = '小王',age=15,
      obj={
        name:'小张',
        age:18,
        say:function (){
          return '姓名'+this.name+'年龄'+this.age
        }
      }
      let s = obj.say
      console.log(name,obj.name,s())

    这个时候,我们等于把say函数重新赋值了,就相当于s和say是相同的代码,那么我们再去调用s(),是不是就变成了window调用,就达到了我们的目的.

    结果:姓名小王年龄15

    下面说一下call  apply  bind的区别.

    通过上面的案列就能看出this是可以通过js进行改变的,js也提供了三种方法,一下为三种方法的用法:

    var name = '小王',age=15,
      obj={
        name:'小张',
        age:18,
        say:function (){
          console.log('姓名:'+this.name+',年龄:'+this.age)
        }
      },
      change={
        name:'改变',
        age:24
      };
     obj.say.bind(change)() //姓名:改变,年龄:25
     obj.say.call(change)   //姓名:改变,年龄:25
    obj.say.apply(change)   //姓名:改变,年龄:25
    
    

    这样我们就把say函数里面的this指向改到了change上,

    以上是他们调用方式的不同,我们可以看出来 使用call和apply的时候基本是一样的调用方式,但是在使用bind的时候我们后面多加了(),这是因为我们使用bing的时候,返回的是一个函数,并不会执行,所以当我们要执行的时候就需要在后面再加一个().

    上面说了调用方式的不同,下面说参数的不用

     var name = '小王',age=15,
      obj={
        name:'小张',
        age:18,
        say:function (w,g){
          console.log('姓名:'+this.name+',年龄:'+this.age+',来自:'+w+',去往:'+g)
        }
      },
      change={
        name:'改变',
        age:24
      };
    
     obj.say.bind(change,'河南','北京')() //姓名:改变,年龄:24,来自:河南,去往:北京
     obj.say.call(change,'河南','北京') //姓名:改变,年龄:24,来自:河南,去往:北京
     obj.say.apply(change,['河南','北京'])  //姓名:改变,年龄:24,来自:河南,去往:北京

    上面就是传参的方式,我们可以看出来  传参的时候,当使用bind和call的时候都是一样的,就是绑定对象后面,一个一个输入参数就行了,但是到apply的时候就变了,它接收的是一个数组,数组里面的参数会被解析成一个一个的参数,更加的方便,

    当然它的参数并不仅限制于字符串哦,各种类型都是可以的哦,有兴趣的自己尝试一下!

  • 相关阅读:
    Springboot中使用Scala开发
    aliyun阿里云Maven仓库地址
    css文字滚动
    随笔
    下拉菜单事件
    微信分享
    微信分享功能
    随笔记
    全屏设置
    判定复选框的选中状态
  • 原文地址:https://www.cnblogs.com/wgs-blog/p/15079972.html
Copyright © 2020-2023  润新知