初识认识

首先呢,要先了解一点,在js中,所有的函数都是Fuction的实例,既然是Function的实例,那么,每个函数都具有它原型(及Function.prototype)上的方法,call、apply和bind三者都是Function原型中的方法,所以,每一个参数都可以去调用者三个方法。

下图是Function原型上的所有方法,可以做一个简单了解
image.png

有什么作用

大家都知道,在js中,最头疼的一个问题就是this指针的指向问题,在初学js的过程中,我们处处都会碰到this,那么this指向谁,或者我们可不可用某个对象来调用不属于它的方法呢,而call、apply和bind可以改变this指针的指向,我们可以还可以通过这三者来实现类的属性和方法的继承

如何使用

我们通过代码来了解一下吧,如下

  1. var name = "zhangsan"
  2. function say(age){
  3. console.log("Hello, " + this.name + ",您的年龄是" + age)
  4. }
  5. var person = {
  6. name: "kevin"
  7. }
  8. say(20) //Hello, zhangsan,您的年龄是20
  9. say.call(person,26) // Hello, kevin,您的年龄是26
  10. say.apply(person,[26]) // Hello, kevin,您的年龄是26
  11. say.bind(person,26)() // Hello, kevin,您的年龄是26

从上面我们可以看出,如果直接调用 say 方法,那么它的this是指向 window 对象的,而通过call、apply和bind方法,它将this指针指向了 person ,所以我们不难发现它们的作用

三者区别

三者的功能都是改变了this的指向,不同点就在于它们三者的使用方法和传参上面

  1. call是通过普通实参的方式进行传参,call(对象, arg1, arg2, …)
  2. apply是通过数组的方式进行传参,apply(对象, [arg1, arg2, …])
  3. bind是通过普通实参的方式进行传参,跟call一样,跟以上两者不一样的地方就在于,bind返回的是一个函数,需要通过自调用的方式来运行该方法