javaScript模拟实现call

//给所有函数添加一个hycall的方法 模拟call

Function.prototype.hycall = function () {
  //call函数通过.call()会调用一次函数,那么在这个函数中也要执行一下调用hycall的那个函数
  // 问题:得可以获取到哪一个函数执行了hycall
  var fn = this;
  fn()
}
function sum(num1,num2) {
  return num1+num2
}
function foo() {
  console.log('foo函数被执行')
}
// 系统函数的call方法
//1.foo会被调用一次
//2.foo.call({}),而且会绑定this,this指向传入call函数的值
foo.call()
// this默认绑定

foo.hycall()//此时调用hycall会执行一次foo
sum.hycall()//此时调用hycall会执行一次foo

call()是c++实现的

这里用js模拟foo.call()传入的参数的实现

在这里插入图片描述

Function.prototype.hycall = function (thisArg) {
  //call函数通过.call()会调用一次函数,那么在这个函数中也要执行一下调用hycall的那个函数
  // 问题:得可以获取到哪一个函数执行了hycall
  var fn = this;//获取需要被执行的函数
  //this指向传入的参数
  //方法一:(不推荐 本身就是要实现call)
  fn.call(thisArg)//调用需要被执行的函数
  //方法二:
  thisArg.fn=fn//thisArg如果是23数字会报错 可以var num=new Number(123) 因为这时候num
  thisArg.fn()//隐式绑定--传入的就可以被隐式绑定了
  delete thisArg.fn//thisArg会多出一个fn的属性,可以等到调用完删除
}

完整
// 给所有的函数添加一个hycall的方法
Function.prototype.hycall = function(thisArg, ...args) {
  // 在这里可以去执行调用的那个函数(foo)
  // 问题: 得可以获取到是哪一个函数执行了hycall
  // 1.获取需要被执行的函数
  // this
  var fn = this

  // 2.对thisArg转成对象类型(防止它传入的是非对象类型)
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg): window

  // 3.调用需要被执行的函数
  thisArg.fn = fn
  var result = thisArg.fn(...args)//传递参数处理 此处会调用一次函数
  delete thisArg.fn

  // 4.将最终的结果返回出去
  //函数有无返回值取决于外部是否需要函数的结果
  return result
}


function foo() {
  console.log("foo函数被执行", this)
}

function sum(num1, num2) {
  console.log("sum函数被执行", this, num1, num2)
  return num1 + num2
}


// 系统的函数的call方法
foo.call(undefined)
var result = sum.call({}, 20, 30)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值