他俩作用只有一个,就是改变this的指向,区别是传参形式不同。他俩的第一个参数均是一个对象(在执行A.call(B)的过程中,会将A中this全部换成B对象),
call是一个方法,是函数的方法,call中其余的参数只能一个一个的传(把实参按照形参的个数传过去),apply其余的参数只有一个,且为数组形式。
- call
// 通过call改变this指向实现,本质是借用别人的方法实现自己的功能
function Person(name,age){
this.name = name;
this.age = age;
}
let obj={}
// call方法会将Person方法执行中的this全部换成call方法中的第一个参数,
// 本题中Person函数执行时会如下变化(将Person中this换成obj对象),即:
// obj.name = "周冬雨"
// obj.age = 18
Person.call(obj,"周冬雨",18)
console.log(obj);
打印如下:
我们发现,通过调用Person.call方法就实现了obj的功能
接着稍微难一点:
function FunA(name,age){
this.name= name;
this.age = age;
}
function FunB(name,age,sex){
// 在new的过程中会因隐式创建一个var this={}(具体new的四步请看我前面的一篇文章)
// 在执行FunA.call方法时会将Fun中的this换成新创建的this(他俩指向不同),并执行FunA中代码,
FunA.call(this,name,age);
//接着执行这条语句
this.sex = sex;
// 走到这里新创建的this对象有了name,age,sex这三个属性及对应的值,最后返回这个新创建的this对象。
}
let funb = new FunB("周冬雨",18,"女");
console.log(funb)
打印结果如下:
2.apply:后面第二个参数必须是数组,其他效果相同
function funA(name,age){
this.name= name;
this.age = age;
}
function funB(name,age,sex){
funA.apply(this,[name,age]); //是个数组
this.sex = sex;
}
let funb= new funB("周冬雨",18,"女");
打印结果如下:
3.不懂就问:在平时开发中哪里可能会用到?
存在这样一种场景,若你的需求完全大于其他人实现的功能,就可以通过.call使用,借用别人的方法实现自己的功能,不需要自己再重复写代码实现。
问:bind和call是什么区别?
调用call时候本身会执行这个方法 ,而调用bind不会执行,而是返回一个函数。
function Person(name,age){
name ='周冬雨';
age= 18;
console.log(this.name);
console.log(this.age);
}
let obj={
name:"马冬梅",
age:19,
}
Person.call(obj,"周冬雨",18)
相信对于call我们已经很熟悉了,就是改变this指向,在调用call时候本身执行了Person这个方法。
下面看bind:
function Person(name,age){
name ='周冬雨';
age= 18;
console.log(this.name);
console.log(this.age);
}
let obj={
name:"马冬梅",
age:19,
}
let person= Person.bind(obj,"周冬雨",18)
person();
我们看到结果一样的,但真正输出结果是因为调用了person这个方法才有的,因为调用bind过程中不会执行方法,只会返回一个方法,然后再执行。这两句话加起来的效果和直接调用call的效果是一样的。