推薦嗶站一個老師的視頻講解,非常詳細易懂,5分鐘學會!前端面試題:call、apply、bind的基本概念
這三個都是函數的方法,用來改變函數中的this指向!
關于call的使用:(3個方法類似,學習call,總結區別即可)
① 調用不需要傳參數的函數( fun.call(cat); )
// 定義一個fun函數
function fun(){console.log(this.name);
}
// 定義一個cat對象
let cat = {name: '喵喵'
}
// call可以調用函數,call可以改變函數中的this指向
// 參數cat表示想要fun函數的this指向哪個對象,這里指向cat對象
fun.call(cat); // 輸出:喵喵
② 調用需要傳遞參數的函數 ( dog.eat.call(cat,'魚','肉'); )
// 定義一個dog對象
let dog = {name: '汪汪',eat(food1,food2){console.log('我喜歡吃'+food1+food2);}
}
// 定義一個cat對象
let cat = {name: '喵喵'
}// 直接調用eat函數
dog.eat('骨頭','湯'); // 輸出:我喜歡吃骨頭湯// 使用call調用函數,改變this指向,指向cat
// 第一個參數cat表示:想要函數eat的this指向cat對象;
// 之后的參數表示:eat函數需要傳遞的參數
dog.eat.call(cat,'魚','肉'); // 輸出:我喜歡吃魚肉
總結:
call 和 apply 和 bind,用來改變函數的this指向;
三者的區別:
① call
dog.eat.call(cat,'魚','肉');
② apply
dog.eat.apply(cat,['魚','肉']); // 參數傳遞的方式不一樣,apply需要以數組的方式進行傳遞
③ bind
let fun = dog.eat.bind(cat,'魚','肉'); //? bind不會自動調用eat函數,需要手動調用
fun();