function add(c, d) {
return this.a + this.b + c + d;
}
// context表示需要被绑定的上下文
Function.prototype.myCall = function(context) {
var context = context || window; // 将执行上下文设置为当前上下文,若无参数值,则设置为全局上下文
context.func = this; // 使当前上下文可以执行函数
var args = []; // call()方法必须逐个传参,此处将arguments转为数组放入函数中执行
// arguments是类数组对象,可通过length获取长度,遍历从1开始是因为arguments[0] = context
for(var i = 1; i < arguments.length; i ++) {
args.push('arguments[' + i + ']');
}
var result = eval('context.func('+args+')'); // 基于this的上下文执行函数并返回结果
delete context.func;
return result;
}
const obj = { a: 1, b: 2 };
console.log(add.myCall({ a: 3, b: 9 }, 3, 4)); // 19
console.log(add.myCall({ a: 3, b: 9 }, {xx: 1}, 4)); // 12[object Object]4
console