面试题:
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;
第三个及第三个以后的参数作为实参传给第一个参数。

最新文章

  1. TFS 生成发布代理
  2. sqlite的常用语法
  3. 7.6--找过点最多的直线(CC150)
  4. JAVA枚举
  5. Block的使用及循环引用的解决
  6. C# GridControl 行背景颜色
  7. 如何修改svn的密码或重新输入用户名密码
  8. mysqldump 数据库迁移并改换engine
  9. 动手学servlet(四) cookie和session
  10. python 中的集合(set) 详解
  11. 【打表】HDOJ-2089-不要62
  12. CSS Positioning(定位)
  13. zabbix 对于logstash告警连续发邮件
  14. poj 3026 Borg Maze bfs建图+最小生成树
  15. day8 - isinstance--issubclass-异常处理-自定义异常
  16. MYSQL-联合索引
  17. 自学Python6.4-内置模块(2)
  18. [Web 前端] react-router4-0中文文档
  19. NEXYS 3开发板练手--LED与数码管时钟
  20. Tensorflow源码编译,解决tf提示未使用SSE4.1 SSE4.2 AVX警告【转】

热门文章

  1. kali的网络服务
  2. Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法
  3. XMind 8 Pro 破解
  4. python学习——读取染色体长度(四:获取最长染色体的编号)
  5. SQL 查询中case的运用
  6. 使用fiddler模拟控制网速,实现网速慢。(丢包如何模拟)
  7. MongoDB索引基本操作
  8. phpcms不能批量更新栏目页和内容页
  9. [转帖]Shell脚本中的break continue exit return
  10. JQ倒计时,正计时