在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)("唱歌","跳舞");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。