;(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);