手写一个call

loong / 217 /

ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz

;(function(){
 // 接收实参有三种方案 1、通过形参  2、...args 数组  3、arguments 伪数组,并且接收了所有的实参  
    // 因为call 接收不是数组 也不能安找形参来接收,所以选择第三种 arguments 接收
 function myCall(context, arguments){
  context = context ? Object(context): window

  //this 只要谁调用  this就是谁 这里表示 fn

  // ================== 因为this指向了函数 所以可以试着 这样
  //this() // 因为是独立函数调用 所以this 又指向了window 所以这样写不行
  // ==================

  // ================== 因为this指向了函数 也可以试着这样  
  let res = context.f(...args)
  // ================== 
  
  let args = []
  for(let i = 1; i<arguments.length; i++){
   args.push(arguments[i])
  }
  let res = context.f(...args)

  // 但是这样的就往源数据上添加了一个属性, 所以我们需要删除 f属性
  delete context.f
  
  return res;
 }
 
 // 挂载到Function 的原型对象上,就意味着所有的函数都可以调用myCall
 Function.prototype.myCall = myCall;
})()

function fn(num1, num2){
 console.log(this)
 return num1 + num2
}

let obj = {name: 'wc'}
let res = fn.myCall(obj ,1 ,2);

作者
loong
许可协议
CC BY 4.0
发布于
2023-08-27
修改于
2024-12-23
Bonnie image
尚未登录