先中文翻译下,call(访问/呼叫) bind(捆绑/约束)apply(申请/请求),由下图可得知call,bind,apply都是Function对象的方法。
再使用了一候后,发觉call,apply,bind是为了让函数方法的复用,节省空间,请看下面例子:
图中小红跟小张是朋友,相约一起去上海,一天另一人同时对他们两个人问起同一问题,小红不善表达,这时就借小张之口帮小红说出。
综上call跟apply是都正确执行了结果,bind返回了函数体,先撇开bind,首先搞清楚call,apply的不同吧。
修改下上面say的内容
再执行
差别就出来了,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 等等!