在 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。
那么如何用 man
的say
办法来显示 woman
的数据呢。
对于 call 能够这样:
man.say.call(woman);
对于 apply 能够这样:
man.say.apply(woman);
而对于 bind 来说须要这样:
man.say.bind(woman)();
如果间接写 man.say.bind(woman)
是不会有任何后果的,看到区别了吗?call
和 apply
都是对函数的间接调用,而 bind
办法返回的依然是一个函数,因而前面还须要 ()
来进行调用才能够。
那么 call
和apply
有什么区别呢?咱们把例子略微改写一下。
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)("唱歌","跳舞");