call,apply,bind的区别和用法

call,apply,bind方法都是Function原型中的方法,而所有的函数都是Function的实例。

用途:改变this指向

区别:call和apply改变了函数的this指向后便立即执行该函数,而bind则是返回一个新的函数,不执行。

call方法思想:改变this指向,让新的对象可以执行这个方法
实现思路
1、给新的对象添加一个函数(方法),并让this(也就是当前绑定的函数)指向这个函数
2、执行这个函数
3、执行完以后删除这个方法
4、可以将执行结果返回
apply方法思想:与call类似,只不过他需要判断一下参数数组是否存在。
bind方法思想
1、返回一个函数,其他与call, apply类似
2、如果返回的函数作为构造函数,bind时指定的 this 值会失效,但传入的参数依然生效。

具体内容如下:

var p1={
name:"aa",
hobby:this.hobby,
play:function(sex,age){
console.log(this.name+'的年龄为:'+ age + '岁,性别为:' + sex  +'爱好是:'+this.hobby);
}
}
var p2={
name:'bb',
hobby:'敲代码'
}
p1.play.call(p2,'男',22);
p1.play.apply(p2,['男',22]);
//bind不兼容IE6~8
//p1.play.bind(p2,'男',22)();
var fn=p1.play.bind(p2,'男',22);
fn();

在上述代码中,三种方法都实现了改变this指向

bb的年龄为:22岁,性别为:男爱好是:敲代码
bb的年龄为:22岁,性别为:男爱好是:敲代码
bb的年龄为:22岁,性别为:男爱好是:敲代码
call和apply的区别:传参列表不同

call中的参数必须是一个一个添加,而apply中的参数是以数组的形式进行添加。
注意
在非严格模式下:如果不传递参数,或者第一个参数是null,undefined,this都指向window。
在严格模式下:第一个参数是谁,this就指向谁,包括null和undefined,如果不传参数,this就是undefined。
bind:挂在Function.prototype上
bind指向失效的问题:

 var p={
    age:12
    }
    function Person(){
    console.log(this);//Person {}
    console.log(this.age);//访问不到了
   //  new之后构造函数中会生成
   //this={
   //age:undefined
   //   }
    }
    var person2=Person.bind(p);//改变this指向后不执行
    new person2();

bind返回一个新的函数,它的this指向p,它把函数交给了person2,在new的时候this指向实例化后的对象本身,此时的new person2相当于var p2=new person2(),这时bind就没有用了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值