JS-call,bind,apply
先中文翻译下,call(访问/呼叫) bind(捆绑/约束)apply(申请/请求),由下图可得知call,bind,apply都是Function对象的方法。
文章图片
再使用了一候后,发觉call,apply,bind是为了让函数方法的复用,节省空间,请看下面例子:
文章图片
图中小红跟小张是朋友,相约一起去上海,一天另一人同时对他们两个人问起同一问题,小红不善表达,这时就借小张之口帮小红说出。
文章图片
综上call跟apply是都正确执行了结果,bind返回了函数体,先撇开bind,首先搞清楚call,apply的不同吧。
修改下上面say的内容
文章图片
【JS-call,bind,apply】再执行
文章图片
差别就出来了,call的第二部分参数,需要传入的是字符串,可以一个一个传入
而apply一个一个传入时,报错,要想正确显示,需要将参数放入一个数组内,才能正确运行。
接下来解决bind就大功告成了~
文章图片
之前我们,已经知道bind返回时函数体,那么要其执行,就在后面加上()就可以了,执行问题解决了,那么我们传入参数试试,第一次传入数组时,bind把数组当成第一个参数执行,第二次传入一个一个字符串,完美执行了,
第三次传入两个数字,按第二种情况执行了,bind的结果也出来了,不同apply,bind的参数传入方式跟call相似。
总结:
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面zhang.say.call(hong,'山西', ... ,'string' );
apply的所有参数都必须放在一个数组里面传进去zhang.say.apply(hong,,['山西', ..., 'string' ]);
bind除了返回是函数体以外,它 的参数和call 一样。
当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!
推荐阅读
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- DataBinding入门进阶指南(一)
- 写给DataBinding初学者的入门介绍
- [002]Binder整体框架的介绍
- 手动实现bind方法
- call和apply的应用
- Scala|Scala 从Array数组的构造过程理解apply()
- 获取平均数之Function.prototype.call()、Function.prototype.apply()应用
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- Javascript之bind,call,apply方法的使用场景和区别