模拟call和apply的实现

call和apply特点

  • 传进去一个参数用来改变this指向
  • 执行函数
function f1(){
   console.log(this)
}

f1.call("hello") // [String: 'hello']


call实现原理

  • 在Function原型链上声明一个函数myCall,传进去一个参数content,如果content不存在,则默认为window
  • 在content上挂一个函数,指向this,这样调用这个函数相当于调用了外部函数,同时this指向content
  • 接收剩余参数,用eval实现调用
  • 删除content.fn
Function.prototype.myCall = function(content){
   content =  content?Object(content):window
   content.fn = this; //这里的this是外部调用的函数,这里将外部的函数赋值给fn
   let args = []
   for(let i = 1;i<arguments.length;++i){
       args.push('arguments['+i+']')
   }
   let r = eval('content.fn('+args+')') //直接调用fn函数,则this指向它的调用者,即content,同时数组会调用toString方法,将其元素展开
   delete content.fn; //调用完之后,删除函数
   return r;
}

function fn1(){
 
   console.log(this)
   console.log(arguments)
}

fn1.myCall("hello",1,2,3)



apply原理

apply跟call类似,传进去的是一个数组

Function.prototype.myApply = function(content,args){
    content =  content?Object(content):window
    content.fn = this; //这里的this是外部调用的函数,这里将外部的函数赋值给fn
    if(!args){
        return content.fn();
    }
    let r = eval('content.fn('+args+')') //直接调用fn函数,则this指向它的调用者,即content,同时数组会调用toString方法,将其元素展开
    delete content.fn; //调用完之后,删除函数
    return r;
}



function fn1(){
  
    console.log(this)
    console.log(arguments)
}

// fn1.myCall("hello",1,2,3)
fn1.myApply("word",[1,2,3])
···
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

问也去

创作不易,感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值