在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)("唱歌","跳舞");