前端技能大挑战-3(修改this指向)

说题目之前先总结下call,apply,bind

 

共同点:

(1)改变this指向

(2)第一个参数都是this要指向的对象

(3)都可以利用后面传参

 

不同点:

(1)传参方式不同

(2)bind返回的是一个函数,仅仅this指向改变了,还需继续调用

 

例子(无参数情况)

var mr = {
     name: 'Mrc ',
     say: function () {
         console.log(this.name);      
    }
}

var ty = {
    name: 'ty',
    say: function () {
         console.log(this.name);      
    }
}

call:

mr.say.call(ty)

apply:

mr.say.apply(ty)

bind:

mr.say.bind(ty)()

无参数情况下,call和apply用法一样

 

例子(有参数情况)

var mr = {
     name: 'Mrc ',
     say: function (sex,hobby) {
         console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby);      
    }
}

var ty = {
    name: 'ty',
    say: function (sex,hobby) {
         console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby);      
    }
}

  

call:

mr.say.call(ty , '女' , '吃')

apply:

mr.say.apply(ty  ,['女' , '吃'])

bind:

mr.say.bind(ty , '女' , '吃')()

mr.say.bind(ty)('女' , '吃')

 

 

接下来进入正题

题目描述

封装函数 f,使 f 的 this 指向指定的对象
function bindThis(f, oTarget) {
    //方法1 apply()
    return function(){
        return f.apply(oTarget,arguments);
    };
    //方法2 bind()
    return f.bind(oTarget);
    //方法3 call()
    return function(x,y){
        return f.call(oTarget,x,y);
    };
}


为什么有匿名函数,是因为apply call 是绑定之后是立即调用的,

所以需要匿名函数包装且需要传入原函数的参数argumengts. bind 会创建一个新函数,即函数副本,绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

所以想表达的意思是arguments不能省略

转载于:https://www.cnblogs.com/manru75/p/10405047.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值