call()、apply()、bind()

call()、apply()、bind() 都是用来重定义 this 这个对象的!


var name = "123s" ,age = 88;
var obj = {
    name:"321s",
    objAge:this.age,
    myfun:function(){
        console.log(this.name + "年龄" + this.age);
    }
}

var db = {
    name:"德玛",
    age:99
}

obj.myfun()         //321s年龄undefind
obj.myFun.call(db);    //德玛年龄99
obj.myFun.apply(db);    //德玛年龄99
obj.myFun.bind(db)();   //德玛年龄99     //注意这里 后面多了一个() ********

bind 返回的是一个新的函数,你必须调用它才会被执行

================================================= 以上指示单纯的改变this 指向

下面是带参传递 改变this指向

var obj={
    name:"13",
    objAge:this.age,
    fun:function(fm,t){    //有参数    *****
        console.log(this.name + " 年龄 "+this.age, " 来自 "+fm +" 去往 "+t);
    }
    
}
var db = {
    name:"德玛",
    age:99
}

obj.myFun.call(db,'成都','上海');     //德玛 年龄 99  来自 成都去往上海

obj.myFun.apply(db,['成都','上海']);        //德玛 年龄 99  来自 成都去往上海  

obj.myFun.bind(db,'成都','上海')();         //德玛 年龄 99  来自 成都去往上海

obj.myFun.bind(db,['成都','上海'])();   //德玛 年龄 99  来自 成都,上海去往undefined     //[] 中的成了一个参数

 微妙的差距!
  从上面四个结果不难看出
    call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
    call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面  obj.myFun.call(db,'成都', ... ,'string' );
    apply的所有参数都必须放在一个数组里面传进去  obj.myFun.apply(db,['成都', ..., 'string' ]);
    bind除了返回是函数以外,它 的参数和call 一样。
    
    当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值