共同点:
1、都用来改变函数的this对象的指向
2、第一个对象都是this要指向的对象
3、都可以用后续的参数进行穿参
举个栗子说区别:
const personOne = {
name: "小周周",
age: 4,
say: function () {
console.log(this.name + ',' + this.age);
}
}
const personTwo = {
name: "小小周",
age: 2
}
personOne.say(); //小周周,4
如果我们想知道personTwo的信息,personTwo对象又没有方法要怎么实现:
personOne.say.call(personTwo); //小小周,2
personOne.say.apply(personTwo); //小小周,2
personOne.say.bind(personTwo); //没有输出任何东西
可以看出call和apply中第一个参数就是要操作的对象,并且用call和apply实现了调用personOne中say的方法,并且直接执行改方法,而bind返回的其实仍然是个函数,我们需要执行它才能实现输出
personOne.say.bind(personTwo)(); //小小周,2
接着看传参
const personOne = {
name: "小周周",
age: 4,
say: function (gender,father) {
console.log(this.name + ',' + this.age + ',' + gender + ',' + father);
}
}
const personTwo = {
name: "小小周",
age: 2
}
personOne.say('girl','周杰伦'); //小周周,4,girl, 周杰伦
用call、apply和bind:
personOne.say.call(personTwo, "boy", "爸爸周杰伦"); //小小周,2,boy,爸爸周杰伦
personOne.say.apply(personTwo, ["boy", "爸爸周杰伦"]); //小小周,2,boy,爸爸周杰伦
personOne.say.bind(personTwo, "boy", "baba周杰伦")(); //小小周,2,boy,baba周杰伦
apply的第二个参数是一个类似数组(这里为什么是类似可以再百度一下),是所有参数的一个集合
区别说完了,看看各自的实现:
call: