call與apply的語法:
- fun.call(thisArg[, arg1[, arg2[, ...]]])依溯。thisArg是函數(shù)運行時候指定的this,之后是執(zhí)行函數(shù)傳入的參數(shù)列表瘟则。
- fun.apply(thisArg[, argsArray])黎炉。thisArg作用同上,不同call的是傳入的是一個參數(shù)的數(shù)組對象醋拧。
總結(jié)一下call與apply的作用:
- 調(diào)用函數(shù)慷嗜。
- 改變this的指向淀弹。
最重要的是,我們可以衍生出一個作用:借用庆械,借用薇溃,借用。
我們來看一下一個例子:
- 求出數(shù)組arr=[1,7,10,5,0]中最大的值缭乘,一般可以選擇排序或者借個變量判斷痊焊。當然,我們也會想到Math.max()忿峻,但是薄啥,這個方法不接受數(shù)組,這個時候就可以使用apply去借用這個函數(shù)逛尚。
var arr=[1,7,10,5,0]
//這里this沒有任何意義
Math.max.apply(null,arr)//10
- 再來一個例子垄惧,我們知道document.getElementByTagName()獲取的是一個類數(shù)組對象,不能使用數(shù)組的push,pop之類的方法绰寞,這時候可以用借用數(shù)組的slice(分割數(shù)組)的方法進行轉(zhuǎn)化到逊。
//先往頁面放幾個li
var lis=document.getElementsByTagName('li');
var arrLis = [].slice.call(lis)//或者Array.prototype.slice.call(lis)
console.log(arrLis.length);
arrLis.pop();
console.log(arrLis.length)
效果可看這里
- 又或者我們有一個對象,想要用另一個對象去調(diào)用他的屬性方法滤钱。就可以這樣觉壶。
function Animal (age){
this.age=age;
}
function Cat(color,age){
this.color=color;
Animal.call(this,age)
}
var cat1 = new Cat('white',2)
console.log(cat1.age)
我們再來說一說bind();
- fun.bind(thisArg[, arg1[, arg2[, ...]]]),thisArg件缸,this的指向(使用new 調(diào)用的時候無效),之后的參數(shù)是一個參數(shù)列表铜靶。
bind() 函數(shù)會創(chuàng)建一個新函數(shù)(稱為綁定函數(shù)),新函數(shù)與被調(diào)函數(shù)(綁定函數(shù)的目標函數(shù))具有相同的函數(shù)體(在 ECMAScript 5 規(guī)范中內(nèi)置的call
屬性)他炊。當目標函數(shù)被調(diào)用時 this 值綁定到 bind() 的第一個參數(shù)争剿,該參數(shù)不能被重寫。綁定函數(shù)被調(diào)用時痊末,bind() 也接受預設(shè)的參數(shù)提供給原函數(shù)蚕苇。一個綁定函數(shù)也能使用new
操作符創(chuàng)建對象:這種行為就像把原函數(shù)當成構(gòu)造器。提供的 this 值被忽略凿叠,同時調(diào)用時的參數(shù)被提供給模擬函數(shù)涩笤。
現(xiàn)在讓我們看個栗子:
- 我們再使用原型對象綁定事件的時候通常都會把this賦值給self,_this...。但是我們可以使用bind()來設(shè)置得更好:
//先給頁面來個btn盒件;
function Btn (target) {
this.target=target;
this.addEvent();
}
Btn.prototype.addEvent = function(){
this.target.onclick=function(){
//這里的this變成函數(shù)外面的this了
console.log(this.target.id)
}.bind(this)
}
new Btn(document.querySelector('#btn'))
最后說一下3者的區(qū)別蹬碧;
前2者call與apply調(diào)用函數(shù):func.call(thisArg),func.apply(thisArg)。
而bind與上面2者不同:func.bind(thisArg)()履恩;(它的后面多了一個括號锰茉,也就是說bind()方法,不能調(diào)用函數(shù))