修改this指向:封装函数 f,使 f 的 this 指向指定的对象

这个题主要考察call()、bind()、apply()的用法,改变this的指向,区别在于
f.call(obj, arg1, arg2...)
f.bind(obj, arg1, arg2,...)()
f.apply(obj, [arg1, arg2, .])

注意:

bind 返回的是一个新的函数,你必须调用它才会被执行(把对象和函数绑定死);

call和apply不会产生新的函数,只是在调用时,绑定一下而已;

call和apply的区别:第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来

对于这个题需要做两件事

1)使f的this指向指定对象⇔函数调用时,使其执行上下文为对象⇔使对象将函数作为其方法调用
2)对象在调用函数时,需要传入函数所需的形参

// 声明
function callback(arg1, arg2){}
function Func(callback){
    return function(){
        // 在该层封装函数中使用arguments对象取callback形参
    }
}
// 调用
Func(callback)('形参1','形参2')

实现:

// 方法一:apply
function bindThis(f, oTarget) {
    return function() {
        let args = [].slice.call(arguments)
        return f.apply(oTarget,args)
    }   
}
// 方法二:call
function bindThis(f, oTarget) {
    return function() {
        let args = [].slice.call(arguments)
        return f.call(oTarget,...args)
    }   
}
// 方法三:bind
function bindThis(f, oTarget) {
    return f.bind(oTarget)
}
// 方法四:将函数作为对象的方法调用
function bindThis(f, oTarget) {
    // 使用call、apply、bind方法时,该函数是添加到对象原型上的
    // oTarget.__proto__.fn = f
    oTarget.fn = f
    return function(){
        let args = [].slice.call(arguments)
        return oTarget.fn(...args)
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨♡XIN

您的鼓励是我最大的动力与快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值