实现call-apply-bind函数底层封装

首先还是那三步,方法给谁用的?定义在哪里?怎么使用?了解了这三步,封装起来就思路就很清晰了
call-apply-bind这三个方法都是用来改变函数中的this指向,所以第一步来思考一下 函数中的this都能指向哪里呢

函数的this指向

this是在调用函数时,函数所在的执行上下文所决定的
1.普通的全局函数调用时,this指向window;
2.定时器的回调函数,this指向window;
3.事件的回调函数,this指向他的调用者
4.构造函数中的this指向创建出来的实例对象
5.对象中的方法,this指向调用该方法的对象
通过上面的分析不难看出要想改变函数中的this指向只能通过第五种方式。而改变函数的this指向的真正原理就是将函数定义成该对象的一个方法,在通过该对象调用该方法即可改变函数的中的this指向问题

call

call方法用于改变函数的this指向,并调用该函数,参数以单个传参的形式传递。
首先call方法是将给所有的函数用的,所以要定义在所有函数都能访问到的地方,而所有的函数也是一个对象,而函数的构造函数是Function,所以要将call方法定义在Function的prototype原型对象上,即所有函数的对象原型上,可以通过原型链查找到该方法。
具体实现
1.call方法可以传递多个参数,第一个参数是函数的this指向的对象,第二个参数剩余参数,全部接受(args是一个数组)。
2.采用的是第七种数据结构,生成一个独一无二得值,将该值设置为传递进来的第一个参数对象的属性(方法一般定义在原型对象上),并将调用该属性赋值为调用call方法的函数。(前两步:将一个函数设置为另一个对象的属性)
3.调用该方法并将传递进来的参数通过展开运算符传递进调用call方法函数的内部。
4.将对象的原型对象上定义的方法删除掉,以免多次将第一个参数的原型对象上定义多个不同的方法,所以没调用完就将该方法去除。
在这里插入图片描述

apply

apply方法用于改变函数的this指向,并调用该函数,参数以数组形式传递。
apply方法和call方法差别不大,下面说说区别即可
区别
1.传入的第二个参数args为一个数组,这里的args是调用apply传入的就是一个数组,而call方法args是通过剩余参数的形式将多个参数放入args数组中形成的数组。
2.要对args进行校验,这里只要判断是否是数组即可,当然这里也可以做优化,判断出传递的参数确切是一个什么类型并返回,让使用者一看到报错就可以知道是什么错误,增加使用者的体验。
3.将args通过三点结构成一个一个的参数传递进函数中
在这里插入图片描述

bind

bind方法用于改变函数的this指向,并返回一个改变了this指向的新函数,参数以单个传参的形式传递。
1.bind方法可以传入初始值,在返回的方法中,调用时都可以使用这个值;
2.这里是利用了闭包函数的特性,将传入的第一个参数保存起来,后面每一次调用改造后的新函数时,都是将这个函数设置为第一个参数传递进来的对象的属性 然后通过该对象调用apply方法。
在这里插入图片描述
欢迎关注笨笨的熊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值