三者的作用都是修改一个函数中的this
一、call
在调用一个函数时,临时更换一次这个函数中的this为指定的对象。函数本次调用后,this恢复原样
call做了三件事:
(1)函数执行一次;
(2)用自己的第一个实参对象,代替函数中的所有this
(3)将从第二个实参值向后的所有实参值列表,传递给正在调用的函数的所有形参
要调用的函数.call(替换this的对象, 实参值列表)
二、apply
如果实参值列表是放在一个数组中给的,不是多个值分着给的。如果完成同样的替换this的功能,就要换成用apply()实现
要调用的函数.apply(替换this的对象, 数组)
三、bind
基于原函数创建一个一模一样的函数副本,并永久替换函数副本中的this为指定的对象
如果一个对象,总是拿别人的函数使用,代码会很繁琐
var 新函数名=要调用的函数.bind(替换this的对象,固定实参值...)
①bind会基于原函数创建一个一模一样的新函数;
②bind会将新函数副本中的this永久替换为指定对象
注意:回调函数中的this如果不是想要的,必须用bind
①不用call和apply是因为.call()和.apply()都是立刻执行函数的意思,而回调函数恰恰不希望立刻执行函数
②bind不会立即执行,而是返回一个新函数。
var xlx={sname:'x_l_x'}; //等2秒执行
setTimeout(function(){ console.log(`我是${this.sname}`) }.bind(xlx) ,2000);
//立即执行 setTimeout(function(){ console.log(`我是${this.sname}`) }.call(xlx) ,2000);