call,apply,bind的作用是改变函数运行时this的指向,它们的作用相似,不同的是传参的不同和返回形式的不同。
call
call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表。当第一个参数为null、undefined的时候,默认指向window,即 call(obj,arguments)
当obj为null或者undefined时,默认指向window
apply方法
apply接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组。当第一个参数为null、undefined的时候,默认指向window,即 apply(obj,arr)
call和apply本质上是很相似的,只是传参的形式不同,call传arguments,apply传的是数组。
什么时候用什么方法不用纠结。如果你的参数本来就存在一个数组中,那自然就用 apply,如果参数比较散乱相互之间没什么关联,就用 call。例如找一组数中最大值,当然是用apply合理。
bind的用法
和call很相似,第一个参数是this的指向,从第二个参数开始是接收的参数列表。区别在于bind方法返回值是函数以及bind接收的参数列表的使用。
总结
call、apply和bind函数存在的区别:bind返回对应函数, 便于稍后调用; apply, call则是立即调用。在es6的箭头函数下,call和apply会失效。