使用方法3个都相同,函数后面直接调用
call: fn.call(); apply:fn.apply() bind: fn.bind();
相同点
都可以改变函数内部this的指向
区别点
1,call和apply都会立马调用,并改变函数里this的指向
2,call和apply传递的参数不一样,第一个相同,都是传递你要把原来函数里的this指向改变为你所需要的那个对象,第二个参数不同点如下:
- call传参: fn.call(this,agu1,agu2),直接传递值或变量
- apply传参:fn.apply(this,[arr]),传递的必须是一个数组
3, bind不会立即调用函数,可以改变函数内部this的指向,
主要应用场景
1,call:经常被用来做继承,然后就可以使用父类里的一些属性和方法了
2,apply:经常跟数组有关系,比如说借助数学对象的方法查看最大值最小值,或者使用一些数组的方法,来做比较子类的
3,bind:你不想立即调用函数,但是还是要先改变this的指向,那么就用bind,比如说你要给一组按钮添加相同的点击事件,事件里有定时器的函数,但是你需要先改变定时器的this,因为定时器里的this指向的是window,定时器又不立即指向,这个时候就可以再定时器里的函数后面写上bind(this)
代码如下:
var btns=document.querySeletor('button);
for(var i=0;i<btns.length;i++){
btns[i].onclick=function(){
this.disabled=false; //当点击后,禁用这个按钮;这个this指向调用者,
setTimeout(function(){
this.disabled=true; //如果不适用bind改变this指向,默认的this就会指向window,
//如果使用btns[i],这回报错,因为这个按钮点击实在这个for循环后才有的,for循环后,i的值为btns的长度,明显btns中没有这个按钮,所以会报错,
}.bind(this),3000); //这里使用bind可以先改变定时器内部的this,什么时候调用都无所谓,这个this指向的是当前所点击的按钮
}
}