上次文章中提到了可以通過call颤诀,apply佃蚜,bind修改函數(shù)的this指向,今天就來詳細介紹一下着绊。
1谐算、call
- 作用:改變某個函數(shù)內(nèi)部的this指向,指向到新的對象上
- 參數(shù):參數(shù)1 新的this指向归露;后面的參數(shù) 被call的函數(shù)本身如果有形參洲脂,則按位置依次傳入,如果沒有則不傳
- 場景:ES5構(gòu)造函數(shù) 繼承剧包!
function fruit(a,b){
console.log('我最喜歡的水果是'+a+'和'+b);
console.log(this);
}
//1恐锦、遇到call之前,this指向的是window
fruit('蘋果','香蕉') //分別打咏骸:我喜歡的水果是蘋果和香蕉一铅,window
//2、經(jīng)過call的調(diào)用堕油,將fruit的this指向由window指向obj
var obj={name:'zs',age:18}
fruit.call(obj,'蘋果','香蕉') //分別打优似:我喜歡的水果是蘋果和香蕉肮之,obj
//將fruit函數(shù)的this指向修改為obj,并依次傳入實參蘋果和香蕉
2卜录、apply
- 作用:改變this指向戈擒;遇見第一參數(shù)是誰就是誰!執(zhí)行函數(shù)艰毒!
- 參數(shù):參數(shù)1 新的this指向筐高;執(zhí)行函數(shù)傳入的位置上數(shù)據(jù)!第二個參數(shù)數(shù)組 [位置上數(shù)據(jù)]
- 場景:遇見某個函數(shù)的參數(shù)是逗號分隔傳入 -------------------------->數(shù)組形式丑瞧;
function fruit(a,b){
console.log('我最喜歡的水果是'+a+'和'+b);
console.log(this);
}
//1柑土、遇到apply之前,this指向的是window
fruit('蘋果','香蕉') //分別打影硇凇:我喜歡的水果是蘋果和香蕉稽屏,window
//2、經(jīng)過apply的調(diào)用灸促,將fruit的this指向由window指向obj
var obj={name:'zs',age:18}
fruit.apply(obj, ['蘋果', '香蕉']) //分別打印:我喜歡的水果是蘋果和香蕉涵卵,obj
//將fruit函數(shù)的this指向修改為obj浴栽,并傳入?yún)?shù)數(shù)組 ['蘋果', '香蕉']
3、bind
- 作用:把函數(shù)內(nèi)部的this屬性 全部指向我們定的一個對象轿偎!函數(shù)不執(zhí)行5浼Α!;祷蕖萝玷!
- 參數(shù):參數(shù)1 新的this指向;后面的參數(shù) 被call的函數(shù)本身如果有形參昆婿,則按位置依次傳入球碉,如果沒有則不傳
- 場景:【函數(shù),用外部的this改變函數(shù)內(nèi)部this指向仓蛆,用bind感染 fn.bind(新對象)】
function fruit(a, b) {
console.log('我最喜歡的水果是' + a + '和' + b);
console.log(this);
}
//1睁冬、遇到bind之前,this指向的是window
fruit('蘋果', '香蕉') //分別打涌锤怼:我喜歡的水果是蘋果和香蕉豆拨,window
//2、經(jīng)過bind的調(diào)用能庆,將fruit的this指向由window指向obj
var obj = { name: 'zs', age: 18 }
fruit.bind(obj, '蘋果', '香蕉')() //分別打邮┖獭:我喜歡的水果是蘋果和香蕉,obj
//將fruit函數(shù)的this指向修改為obj搁胆,并依次傳入實參蘋果和香蕉
總結(jié)一下這三種方法
- 相同點:都可以改變函數(shù)內(nèi)部this指向
- 不同點:
- call 和 apply 會調(diào)用執(zhí)行函數(shù)弥搞!bind 不會執(zhí)行函數(shù)邮绿!
- 傳遞的參數(shù)不一樣,call和bind傳遞參數(shù)使用逗號隔開,apply使用數(shù)組傳遞;
- 應用場景:
- call ES5構(gòu)造函數(shù)的屬性做繼承.
- apply 參數(shù)形式 逗號形式---------------------->數(shù)組形式
var res = Math.max.apply(Math, [10, 10, 50, 99]) - bind 不執(zhí)行函數(shù), 只是想改變下函數(shù)內(nèi)部this指向拓巧!我感染函數(shù)內(nèi)部this指向斯碌;