乐趣区

关于javascript:手写一个call

;(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);
退出移动版