欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js关于“call方法”百度,阿里超难面试题

程序员文章站 2022-10-03 22:31:30
面试题:function fn(a,b){ console.log(this); console.log(a); console.log(a+b);}fn.call(1);fn.call.call(fn);fn.call.call.call(fn,1,2);fn.call.call.call.cal ......

 

面试题:
function fn(a,b){
    console.log(this);
    console.log(a);
    console.log(a+b);
}
fn.call(1);
fn.call.call(fn);
fn.call.call.call(fn,1,2);
fn.call.call.call.call(fn,1,2,3);

答案:
fn.call(1);  // 1,undefined,nan
fn.call.call(fn);   // fn,undefined,nan
fn.call.call.call(fn,1,2);  //  1,2,nan
fn.call.call.call.call(fn,1,2,3);  //  1,2,5

深层解题思路:
fn.call(1);call的第一个参数改变call前面函数里的关键字this所以输出1;后面没有参数所以a,b为undefined,相加结果为nan;
fn.call.call(fn);这一块是个难点,不过也很好理解! fn.call 找到function.prototype上的call方法(这也是一个函数,也是函数类
                 的一个实例,也可以继续调用call/apply等方法)我们可以把fn.call看成一个函数 a 那么接下就等于a.call(fn),这
                 里执行call方法,把 a 中的关键字this修改为函数 fn ,然后再把函数 a(fn.call) 执行;
fn.call.call.call(fn,1,2);通过上一条的原型链的方法我们可以把 fn.call.call.call 看成 a(fn.call.call).call 执行,此时括
                 里的参数 fn 已经作为函数执行了,所以就成了 a.call(1,2) 执行!1作为第一个参数改变 call 前面函数里的this,
                 后面的参数作为实参传递到函数的形参里!
fn.call.call.call.call(fn,1,2,3); 同上一条原理!


概括性总结:
不怎么理解的话也可以记住这个概括性诀窍:
碰到两个及两个以上的call都是让第一个参数执行,第一个参数必须是函数;
第二个参数是改变第一个参数中this;
第三个及第三个以后的参数作为实参传给第一个参数。