SOURCE

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 命令行工具 X clear

                    
>
console