js中的call()、apply()和bind()的区别

js中的call()、apply()和bind()方法都是为了改变this的指向问题,可以根据不同的需要对this的指向进行修改。

共同点:

call()、apply()和bind()他们的第一个参数都是要重定义this这个对象的,call和apply的用法是一样的

不同点:

call()的参数可以是多个,第二个参数可以是string、function、Array、object等类型;而apply的参数只能是两个,第二个参数只能是数组形式传递到调用函数内部;bind()和call()的参数是一样的可以有多个

call()和apply()调用一个对象的一个方法,用另一个对象替换当前对象;而bind()调用的也是对象里面的方法,但是返回的值是一个函数。

当参数是一个或者没有的时候调用如下:

var name = 'lili',age = 18;
var Person = {name:'sisi',age:20};
var object = {
  name : 'didi',
  age:25,
  fucTesrt : function(){ 
    return this.name +'年龄'+this.age;
  }
}
console.log(object.fucTesrt());  //didi年龄25--this指向object
console.log(object.fucTesrt.call()); //lili年龄18 --this指向window
console.log(object.fucTesrt.call(window)); //lili年龄18--this指向window
console.log(object.fucTesrt.apply()); //lili年龄18--this指向window
console.log(object.fucTesrt.apply(window)); //lili年龄18--this指向window
console.log(object.fucTesrt.apply(Person)); //sisi年龄20--this指向Person
console.log(object.fucTesrt.bind(Person)); //ƒ (){ return this.name +'年龄'+this.age;} --bind()返回值是一个函数
console.log(object.fucTesrt.bind(Person)()); // sisi年龄20--this指向Person

由上面代码可以看出,当我们使用call()、apply()、bind()重定向this的指向的时候,默认情况下,不传参数的时候,默认传参window,当传参为其他的值的时候,就会重新定向this对象的值,为传递的参数。

当传递的参数为多个的时候:

var name = 'lili',age = 18;
var Person = {name:'sisi',age:20};
var object = {
  name : 'didi',
  age:25,
  fucTesrt : function(act,sex){ 
    return this.name +'年龄'+this.age+'所处省份'+act+'性别'+sex;
  }
}
console.log(object.fucTesrt.call(Person,'北京','男')); //sisi年龄20所处省份北京性别男
console.log(object.fucTesrt.call(Person,['北京'],'男')); //sisi年龄20所处省份北京性别男
console.log(object.fucTesrt.apply(Person,['北京','男'])); //sisi年龄20所处省份北京性别男
console.log(object.fucTesrt.bind(Person,'北京','男')()); // sisi年龄20所处省份北京性别男
console.log(object.fucTesrt.bind(Person,['北京'],'男')()); // sisi年龄20所处省份北京性别男

由以上代码可以看出,当传递多个参数的时候,call()和bind()都是可以传递多种类型传递,而apply()只能以数组的形式进行传递,且只能有两个参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值