apply與call方法

apply與call能夠改變函數內部this的指向
apply是函數對象自己身上的方法,可直接用
call也能夠調用函數數組

app

function sum (a, b, c, d){
    console.lo(a+b+c+d);
    console.log(this === obj)
}

var obj = {
    name: "xiaoming",
    age: 18,
    sex: "男"
}
sum(1,2,3,4);

毫無疑問,thid===obj確定是false,由於調用函數sum是window,因此this是window,不等於obj函數

可是若是這樣子調用sum.call(obj,1,2,3,4);
this就是指向objthis

爲何要用call呢?
由於它的參數除了接收實際參數外,還能夠接收一個參數表明this
它的第一個參數就是你但願函數裏面的this是誰,後面的纔是實參prototype


而apply的基本功能和call基本功能是同樣的,區別在於傳遞參數的語法不同
實參是須要拿數組包住
sum.apply(obj,[1,2,3,4]);code

apply的一些巧妙用法對象

1)Math.max 能夠實現獲得數組中最大的一項:
由於Math.max不支持Math.max([param1,param2])也就是數組,可是它支持Math.max(param1,param2...),因此能夠根據apply的特色來解決 var max=Math.max.apply(null,array),這樣就輕易的能夠獲得一個數組中的最大項(apply會將一個數組轉換爲一個參數接一個參數的方式傳遞給方法)
這塊在調用的時候第一個參數給了null,這是由於沒有對象去調用這個方法,我只須要用這個方法幫我運算,獲得返回的結果就行,因此直接傳遞了一個null過去。
用這種方法也能夠實現獲得數組中的最小項:Math.min.apply(null,array)io

(2)
Array.prototype.push能夠實現兩個數組的合併
一樣push方法沒有提供push一個數組,可是它提供了push(param1,param2...paramN),一樣也能夠用apply來轉換一下這個數組,即:
var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6");
Array.prototype.push.apply(arr1,arr2); //獲得合併後數組的長度
由於push就是返回一個數組的長度,也能夠這樣理解。arr1調用了push方法,參數是經過apply將數組轉換爲參數列表的集合
一般在什麼狀況下,可使用apply相似Math.max等之類的特殊用法:
通常在目標函數只須要n個參數列表,而不接收一個數組的形式,能夠經過apply的方式巧妙地解決這個問題。console

相關文章
相關標籤/搜索