call apply bind的相同点和不同点

115 阅读1分钟

我们先来了解call的方法以及使用,只要了解了call,那么apply和bind就非常好理解了

call是一个方法,是函数的方法

call可以调用函数,可以改变this的指向

改变this指向:

我们创建两个对象dog和cat,当调用dog.sayName()时控制台打印的为我是旺财,如果加上.call(),把cat传进去,这个时候打印的就是我是喵喵,可以看到this的指向改变了,指向了cat

     let dog = {
        name: '旺财',
        sayName() {
          console.log('我是' + this.name)
        },
      }
      let cat = {
        name: '喵喵',
      }
      dog.sayName()//我是旺财
      dog.sayName.call(cat)//我是喵喵

我们稍作改动,在dog中再加上eat方法并进行传参,我们在调用时不仅想要调用dog中的eat方法,还想对其进行传参,那么只需要在传入的cat后继续传入即可

  let dog = {
        name: '旺财',
        sayName() {
          console.log('我是' + this.name)
        },
        eat(food1, food2) {
          console.log('我喜欢吃' + food1 + food2)
        },
      }
      let cat = {
        name: '喵喵',
      }

      dog.eat.call(cat, '鱼', '老鼠')//我喜欢吃鱼老鼠

下面我们借助以上代码,了解一下bind,apply和call的三者相同点与不同点

dog.eat.call(cat, '鱼', '老鼠')//我喜欢吃鱼老鼠

这行代码用apply表示为dog.eat.apply(cat, ['鱼', '老鼠'])可以看出我们在使用apply时进行传参需要以数组的形式,那就说明apply也会调用函数,改变this指向

这行代码用bind时dog.eat.bind(cat, '鱼', '老鼠'),控制台会空白,无输出内容,说明方法并没有被调用,

 let fun = dog.eat.bind(cat, '鱼', '老鼠')
      fun()

等同于 dog.eat.call(cat, '鱼', '老鼠')

也就是说bind不会调用函数,可以改变this指向,传参方式与call相同 apply会调用函数,可以改变this指向,传参方式是以数组的执行