改變this指向的三種方式
call、apply、bind三者為改變this指向的方法。
共同點:第一個參數(shù)都為改變this的指針。若第一參數(shù)為null/undefined,this默認指向window
1.call(無數(shù)個參數(shù))
- 第一個參數(shù):改變this指向
- 第二個參數(shù):實參
- 使用之后會自動執(zhí)行該函數(shù)
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(兩個參數(shù))
- 第一個參數(shù):改變this指向
- 第二個參數(shù):數(shù)組(里面為實參)
- 使用時候會自動執(zhí)行函數(shù)
function fn(a,b,c){
console.log(this,a+b+c);
}
fn();
fn.apply(document,[1,2,3]);
3.bind(無數(shù)個參數(shù))
- 第一個參數(shù):改變this指向
- 第二個參數(shù)之后:實參
- 返回值為一個新的函數(shù)
- 使用的時候需要手動調用下返回 的新函數(shù)(不會自動執(zhí)行)
function fn(a,b,c){
console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手動調用一下
4、call、apply、bind相同點以及不同點
(1)相同點:
都可以改變函數(shù)內部的this指向
(2)區(qū)別:
call和apply會調用函數(shù),并且改變函數(shù)的內部的this指向;
call和apply參數(shù)參數(shù)的方式是不一樣的,call參數(shù)是以羅列的方式傳遞,apply參數(shù)是以數(shù)組的方式傳遞;
bind不會調用函數(shù),可以改變函數(shù)內部this指向;
5、各自的應用場景
call經(jīng)常做繼承;
apply經(jīng)常與數(shù)組有關;
bind不調用函數(shù),但是可以改變this的指向,比如改變定時器內部this的指向;