改变this指向的三种方式
call、apply、bind三者为改变this指向的方法。
共同点:第一个参数都为改变this的指针。若第一参数为null/undefined,this默认指向window
1.call(无数个参数)
- 第一个参数:改变this指向
- 第二个参数:实参
- 使用之后会自动执行该函数
function fn(a,b,c){
console.log(this,a+b+c); // this指向window
}
fn();
fn.call(document,1,2,3);//call改变之后this指向document
//输出 #document 6 1,2,3是实参 结果相加为6
2.apply(两个参数)
- 第一个参数:改变this指向
- 第二个参数:数组(里面为实参)
- 使用时候会自动执行函数
function fn(a,b,c){
console.log(this,a+b+c);
}
fn();
fn.apply(document,[1,2,3]);
3.bind(无数个参数)
- 第一个参数:改变this指向
- 第二个参数之后:实参
- 返回值为一个新的函数
- 使用的时候需要手动调用下返回 的新函数(不会自动执行)
function fn(a,b,c){
console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手动调用一下
4、call、apply、bind相同点以及不同点
(1)相同点:
都可以改变函数内部的this指向
(2)区别:
call和apply会调用函数,并且改变函数的内部的this指向;
call和apply参数参数的方式是不一样的,call参数是以罗列的方式传递,apply参数是以数组的方式传递;
bind不会调用函数,可以改变函数内部this指向;
5、各自的应用场景
call经常做继承;
apply经常与数组有关;
bind不调用函数,但是可以改变this的指向,比如改变定时器内部this的指向;