调用的是fn2(这里有些绕,多念叨念叨琢磨琢磨),此时fn1.call中的this指向的是fn2。它改变了call方法(Function.prototype原型上的call)的this指向。此处调用了call方法中的this,即调用了fn2,输出了2。
fn2问题的描述
functionfn1(){
console.log(1);
}
functionfn2(){
console.log(2);
}
fn1.call(fn2);//输出1
fn1.call.call(fn2);//输出2
fn2具体的问题
看到这个题目,第一反应是蒙圈的。
fn1.call(fn2);这个是理解的。
fn1.call.call(fn2);这个蒙圈了。
理解
有些绕,需要多念叨念叨琢磨琢磨。
call方法是Function.prototype原型上天生自带的方法,所有的函数都可以调用的。
我觉得call方法本身没有具体return什么出来,所以是undefined。
Function.prototype.call=functioncall(context){
//[nativecode]
//call方法的功能
//1.把指定函数中的this指向context
//2.把指定函数执行
//那么call方法中的this,即为指定函数。也就是说
//1.把this中的this关键字指向context;
//2.把指定函数执行this();
};
fn1.call(fn2);
按照上面的理解
call方法中的this是fn1
把call方法中的this(fn1)中的this指向fn2
调用call方法中的this
所以调用的是fn1,此时fn1中的this指向的是fn2。
但是这个方法里面并没有使用this,而是直接输出了1。
fn1.call.call(fn2);
按照上面的理解
call方法中的this是fn1.call【所有函数都可以调用call,调用的是原型上call方法】
把call方法中的this(fn1.call)中的this指向fn2
调用call方法中的this
总之,所以调用的是fn2(这里有些绕,多念叨念叨琢磨琢磨),此时fn1.call中的this指向的是fn2。