call, apply和bind
这三个方法都是用来改变 this
指向的对象的。
Function.prototype.call()
Function.prototype.apply()
Function.prototype.bind()
用法
语法
call: function_name.call(new_target_object, param1, param2, ..., paramN)
apply: function_name.apply(new_target_object, [param1, param2, ..., paramN])
bind: function_name.bind(new_target_object, param1, param2, ..., paramN)
call和apply
对于call和apply,第一个参数都是this绑定到的新对象,且如果第一个参数是 null
,this就会指向 window
。
对于call:第二个参数开始可以传参给这个函数。
对于apply:第二个参数是一个数组,数组中的每个元素作为这个函数的参数。
bind
bind方法返回一个修改过的函数。
bind第一个参数也是新对象,从第二个参数开始可以传给这个函数。
bind传参的方式有两种,第一种是在bind时就预先穿进去参数:
function_name.bind(new_target_object, param1)
第二种是在调用是传参,bind时预先传的参数会排在前面,调用时传的参数在后面。
总结
call和apply都是改变这个函数的this指向并立刻执行这个函数,两者的区别仅仅在于传参的不同。而bind返回的是函数,可以先将bind后的函数保存到变量,在需要调用这个函数的时候调用这个函数并且可以传参进去。