一直在用的api,相信大家也都会关注这些api到底内部如何实现的,今天看了下,在这随便做点概要笔记。
从简单的来吧,其实apply和call实现类似,比较简单,都是将调用函数的this指向改为传入的第一个参数,立即执行。只不过两者除context之外的参数传递方式不同,apply传入数组,call逐个展开。
大概就是定义一个myCall-myApply,接收一个context参数(其余用arguments),该函数内部this就是调用者函数,我们直接定义一个变量fn=this,再直接return fn(newArg)即可。
大概意思明白就行。
Bind
这才是今天的重点,因为他是返回一个全新的函数,大概以下几点需要注意
1.判断调用者outerFn是否为函数(typeof)
2.获取绑定时传入的参数(除context之外)
3.新建一个函数bindFn,用于返回,在其内部获取调用时的参数,与上面的参数合并起来传入实际调用的函数内部。通过call-apply都行,来实际调用。
4.由于返回新函数,所以可能存在被new调用,这时候函数内部this指向应该是指向该构造函数的,而不是指向传入的context,所以在call和apply时需要判断执行函数内部的this是否instance of我们新建的函数bindFn,是则直接apply-call(this),否则apply-call(context)
5.函数对象还有prototype属性,可以用来存储一些值,所以我们新返回的bindFn应该添加调用函数outerFn的prototype ,但是还要考虑到原型对象的依赖关系,这里我们需要全新的,所以利用Object.create拷贝一份调用函数outerFn的原型对象给我们的bindFn
6.return大法不用我教了吧!
Ps:在厕所蹲坑码字,腿也太酸了,写了篇小作文呢