js中call和apply、bind的作用和区别

1 篇文章 0 订阅

他俩作用只有一个,就是改变this的指向,区别是传参形式不同。他俩的第一个参数均是一个对象(在执行A.call(B)的过程中,会将A中this全部换成B对象),
call是一个方法,是函数的方法,call中其余的参数只能一个一个的传(把实参按照形参的个数传过去),apply其余的参数只有一个,且为数组形式

  1. 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的效果是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值