前端必会的手写实现面试题——call/apply

开始学习之前听我废话两句

  javascript为我们提供的各种优秀API极大程度提升我们的开发效率,作为初级前端er必须要对常用的API信手拈来,而中高级前端er则需要做到知其然且知其所以然,这也是中高级前端面试常考此类题目的原因。
  手写实现API说难也不难,首先需要我们对API非常熟悉,知道它的每一步都做了什么事情,理清楚逻辑再倒推出实现步骤。下面是我在手写实现API过程中总结出来的精华,希望能帮到你们哦

我默认你们这些小机灵都掌握了文章内容提及的API的使用方法了啊,如果有朋友对某个API还不熟悉,那就先去学习一下再过来看吧

实现call/apply

call和apply的功能和用法很类似,他们的区别是apply接受参数使用的是数组数据类型。 所以我就放在一起写啦。

一句话简单介绍call/apply:
使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法,主要就是以下两步:

  1. 改变this的指向,指向我们指定的地方
  2. 使用传入的参数执行指定的函数

好的,现在我们已经知道这两个API执行过程中发生了什么事了,接下来就是解析和实现他们。

PS:我们先从call入手

实现第一步骤:改变this指向
  假设我们想this指向obj对象,那我们是不是可以把要执行的函数复制到obj里面,再执行,这样就可以修改this指向了,是不是很容易咧。
  这个时候有水友会问,欸?你这样不是给obj增加了一个不属于他的方法吗?不着急,我们执行完之后再把它删除掉不就好了嘛嘿嘿,话不多说,实践是检验真理的唯一标准:

Function.prototype.call2 = function(context) {
   
    //首先要知道是谁调用了call函数,用this可以获取
    context.f = this    //复制函数
    context.f();    //执行函数
    delete context.f    //删除函数
}

var obj = {
   
    name: 'roger'
};

function showName() {
   
    console.log(this.name);
}

showName.call2(obj) //roger

事实证明我们的思路没有错,接下来我们就要去解决传参的问题了

实现第二步骤:传参
  棒棒的我们都知道,call第一个参数是this指向,后面的参数都是需要传入函数的参数,这样就造成了传入参数数量的不确定,这咋搞?
  机智的我们还知道,函数有一个叫arguments的类数组对象,那我们可以取出第二个到最后一个参数,放到一个数组里面,然后再把这个数组里面的值都传入函数里执行:

Function.prototype.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值