初识认识
首先呢,要先了解一点,在js中,所有的函数都是Fuction的实例,既然是Function的实例,那么,每个函数都具有它原型(及Function.prototype)上的方法,call、apply和bind三者都是Function原型中的方法,所以,每一个参数都可以去调用者三个方法。
下图是Function原型上的所有方法,可以做一个简单了解
有什么作用
大家都知道,在js中,最头疼的一个问题就是this指针的指向问题,在初学js的过程中,我们处处都会碰到this,那么this指向谁,或者我们可不可用某个对象来调用不属于它的方法呢,而call、apply和bind可以改变this指针的指向,我们可以还可以通过这三者来实现类的属性和方法的继承。
如何使用
我们通过代码来了解一下吧,如下
var name = "zhangsan"
function say(age){
console.log("Hello, " + this.name + ",您的年龄是" + age)
}
var person = {
name: "kevin"
}
say(20) //Hello, zhangsan,您的年龄是20
say.call(person,26) // Hello, kevin,您的年龄是26
say.apply(person,[26]) // Hello, kevin,您的年龄是26
say.bind(person,26)() // Hello, kevin,您的年龄是26
从上面我们可以看出,如果直接调用 say
方法,那么它的this是指向 window
对象的,而通过call、apply和bind方法,它将this指针指向了 person
,所以我们不难发现它们的作用
三者区别
三者的功能都是改变了this的指向,不同点就在于它们三者的使用方法和传参上面
- call是通过普通实参的方式进行传参,call(对象, arg1, arg2, …)
- apply是通过数组的方式进行传参,apply(对象, [arg1, arg2, …])
- bind是通过普通实参的方式进行传参,跟call一样,跟以上两者不一样的地方就在于,bind返回的是一个函数,需要通过自调用的方式来运行该方法