前面一节学习内容对 call 方法进行了再次学习研究,从中又感悟出不少东西;但是很常见的就是 apply、bind 三个方法同时出现作比较,那么这里也会接着 call 之后把 apply、bind 的学习理解做一个记录。
apply
apply 函数传入的是 this 的指向和参数数组,那么自己实现一个该方法怎么做?其实 apply 的实现和 call 很相似,唯一不同的地方就是方法传入的参数不太一样;既然这样,看如下实现的 apply 实例:
1 | Function.prototype.customApply = function(o, arr) { |
这个实例我在浏览器环境中执行效果如图:
通过上面的实例完全可以看出它和 call 的实现大同小异,区别仅仅在处理函数,那么 apply 的实现就处理完了。
bind
在 call、apply 都已经完成的情况下,那么 bind 也能够改变当前执行函数的执行上下文,那它又是怎么回事?我们该怎么处理呢?
首先,了解一下 bind 和 call、apply 的不同之处,bind 也是函数的方法,作用也是改变 this 执行且也能传递多个参数,那么区别究竟是什么?答案就是它不会立即执行,返回的是一个改变上下文 this 指向后的函数,原函数并没有被改变。当使用 new 操作符调用绑定函数是,传入的第一个参数无效。
直接看一下原生的 bind 方法执行,如下图:
既然对其概念和执行过程都了解后,自己模拟一个该方法。
1 | Function.prototype.customBind = function(o) { |
在浏览器的执行结果如图
特殊情况就是在使用 new 操作符调用绑定函数时,传入的改变执行环境上下文的参数无效,实现如下图:
1 | Function.prototype.customBind = function(o) { |
在浏览器执行结果如图:
前面是正常执行绑定操作,那么使用 new 操作符调用绑定函数呢?
1 | let newBindFoo = new bindFoo(22); |
这里 bind 返回的函数作为构造函数的时候,它绑定的 this 不会有任何作用,但是在绑定的时候传入的参数仍然有用。
浏览器中的执行结果如下:
最后,在上面的所有流程走完之后,基本上对 call、apply、bind 的三个方法的学习也告一段落,其中的代码在手动实现的过程中又学习到了不少新内容。温故而知新呢…………