前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javascript前端开发:腾讯超难面试题让你理解call的用法

javascript前端开发:腾讯超难面试题让你理解call的用法

原创
作者头像
用户4831957
修改2019-07-03 17:59:59
7390
修改2019-07-03 17:59:59
举报
文章被收录于专栏:网站建设、网站制作专栏

关于javascript中的call方法,网上总很难找到全面而通俗的解释,就我个人的理解来说,call有两个作用:

1、继承 2、修改函数运行时的this指针。

下面这段代码来自鹅厂的前端面试题库。

代码语言:javascript
复制
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;

第三个及第三个以后的参数作为实参传给第一个参数。

通过这个题目,可以加深大家对call方法的理解,欢迎大家转发和关注。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题解:
  • 概括性总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档