function fn1() {
console.log(1);
}
function fn2() {
console.log(2);
}
fn1.call(fn2); // 1
fn1.call.call(fn2); // 2
首先
fn1
通过原型链找到Function.prototype
上的call
方法,然后再让call
方法通过原型再找到Function
原型上的call
(因为call
本身的值也是一个函数,所以同样可以让Function.prototype
),在第二次找到call
的时候再让方法执行,方法中的this
是fn1.call
,而this被fn2替代,然后再让fn1.call
执行。Function.prototype.call = test;
function test (context) {
// 改变fn中的this关键字
// eval(....);
// 让fn方法执行
this(); // 此时的this就是fn1
};
fn1.call.call(fn2)就是test.call(fn2);test.call(fn2)中的this就是test,然后把call中this改成fn2,然后执行
Function.prototype.call = test; function test (context) { // 改变fn中的this关键字 // eval(....); // 让fn方法执行 fn2(); //2 };