SOURCE

// 手动实现call函数
Function.prototype.call2 = function (obj) {
    // 传null的话,this就指向window
    var obj = obj || window
    var args = []
    for(var i = 1, len = arguments.length; i < len; i++) {
        args.push(`arguments[${i}]`)
    }

    // 拿到调用call2的函数,作为obj的方法
    obj.fn = this
    // 加上入参,并执行函数
    var res = eval(`obj.fn(${args})`)   
    // 删除之前的方法 
    delete obj.fn
    // 函数返回值
    return res
}

// 测试一下
var value = 2;

var obj = {
    value: 1
}

function bar(name, age) {
    console.log(this.value);
    return {
        value: this.value,
        name: name,
        age: age
    }
}

bar.call2(null); // 2
var res = bar.call2(obj, 'kevin', 18)
console.log(res);
console 命令行工具 X clear

                    
>
console