call, apply, bind 算是比较面试中比较常问到的几个问题,再我们实际开发中也算是常用到的几个方法,了解清楚他们背后的运行机制和原理对一个前端开发者来说也就十分的必要了。
用法
先来看看他们各自的用法
1 |
|
call 和 apply的区别只是在第二参数,他们第一个参数都是用于改变函数this的指向,call 后面需要按顺序传入函数所需的多个参数, apply 则需要将函数所需的参数放入数组中传给apply的第二参数。
bind 和他们又很不一样,bind会返回一个改变了this的新的函数,后面和call一样,你可以把所有参数提前传入,也可以后面再把参数传入。
原生实现
了解他们各自的用法之后,我们也可以自己通过原生的代码去实现上面的方法
call 的实现
1 |
|
apply 的实现
实现了call之后,apply 的实现也是类似的
1 | // 唯一的区别就是这里的params不需要展开运算符 |
bind 的实现
bind 和 call 有点类似,但又不太一样,bind 会返回一个新的函数,所以我们得保存传入的this然后返回一个新的函数出来
1 |
|
现在我们可以更好的去理解为什么bind之后的方法无法再去改变他的this了,因为闭包的关系,传入的new_this我们是无法再去改变他的指向的.