JS中,这三者都是用来扭转函数的this对象的指向的,他们有什么样的区别呢。
在说区别之前还是先总结一下三者的相似之处:
1、都是用来扭转函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都能够利用后续参数传参。
那么他们的区别在哪里的,先看一个例子。

const man = {      name : "小王",      gender : "男",      age : 24,      say : () => {               console.log(this.name + " , " + this.gender + " ,往年" + this.age);               }}const woman = {      name : "小红",      gender : "女",      age : 18}man.say();

自身没什么好说的,显示的必定是小王,男,往年24。
那么如何用mansay办法来显示woman的数据呢。

对于call能够这样:
man.say.call(woman);
对于apply能够这样:
man.say.apply(woman);
而对于bind来说须要这样:
man.say.bind(woman)();

如果间接写man.say.bind(woman)是不会有任何后果的,看到区别了吗?callapply都是对函数的间接调用,而bind办法返回的依然是一个函数,因而前面还须要()来进行调用才能够。
那么callapply有什么区别呢?咱们把例子略微改写一下。

const man = {      name : "小王",      gender : "男",      age : 24,      say : (like1, like2) => {               console.log(this.name + " , " + this.gender + " ,往年" + this.age + " ,喜爱" + like1 + "和" + like2);               }}const woman = {      name : "小红",      gender : "女",      age : 18}

能够看到say办法多了两个参数,咱们通过call/apply的参数进行传参。
对于call来说是这样的

man.say.call(woman,"唱歌","跳舞");       

而对于apply来说是这样的

man.say.apply(woman,["唱歌","跳舞"]);

看到区别了吗,call前面的参数与say办法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say办法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它能够像call那样传参。

man.say.bind(woman,"唱歌","跳舞")();

然而因为bind返回的依然是一个函数,所以咱们还能够在调用的时候再进行传参。

man.say.bind(woman)("唱歌","跳舞");