面试官:你能手写实现call,apply,bind方法吗?

前言

[实践系列] 主要是让咱们经过实践去加深对一些原理的理解。前端

实践系列-前端路由 git

实践系列-Babel原理 es6

实践系列-Promises/A+规范 github

实践系列-浏览器缓存机制web

有兴趣的同窗能够关注 个人博客 ,以后不断会有干货更新哦。 求star求follow~数组

三兄弟的做用.

apply.call.bind 都是为了改变函数运行时上下文(this指向)而存在的。

image

三兄弟的区别.

  • 三兄弟接收的第一个参数都是 要绑定的this指向.
  • apply的第二个参数是一个参数数组,call和bind的第二个及以后的参数做为函数实参按顺序传入。
  • bind不会当即调用,其余两个会当即调用。

image

接下来,咱们来对三兄弟进行模拟实现浏览器

call的简易模拟实现(es6)

思路

  • 函数定义在哪里 ?
call是能够被全部方法调用的,因此毫无疑问的定义在 Function的原型上!
  • 函数接收参数 ?
绑定函数被调用时只传入第二个参数及以后的参数
  • 如何显式绑定this ?
若是调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。

ojbk..理清了思路.开撸缓存

image

apply的简易模拟实现(es6)

apply实现的思路与call基本相同,咱们只须要对参数进行不一样处理便可app

image

bind的简易模拟实现(es6)

这里只是作简易实现,不考虑new操做符的状况,以后会写个文章对这个知识点进行详解~函数

思路

  • 函数定义在哪里 ?
bind是能够被全部方法调用的,因此毫无疑问的定义在 Function的原型上!
  • 函数接收参数 ?
bind函数返回一个绑定函数,最终调用须要传入函数实参和绑定函数的实参!!
  • 如何显式绑定this ?
若是调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。

image

End

若是有帮助到你,请给我一个star,就算是对个人感谢啦~

相关文章
相关标签/搜索