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