apply趁窃、call
在javascript中牧挣,apply、call都是為了改變某個函數(shù)的運行上下文而存在的醒陆,換句話說瀑构,也就是為了改變函數(shù)體內(nèi)this的指向。
首先看一個例子
function fruits() {}
fruits.prototype = {
color: "red",
say: function() {
console.log("My color is " + this.color);
}
}
var apple = new fruits;
apple.say(); //My color is red
假如我們又有一個對象banana:{ color:"yellow"},我們不想對他重新定義say()方法刨摩,這時我們就可以引用apply或者call寺晌。
banana={
color:"yellow"
}
apple.say.call(banana); //My color is yellow
apple.say.apply(banana); //My color is yellow
由以上代碼可以看出,原本不具有say方法的banana由于使用了apply澡刹、call方法后呻征,改變了this的指向。
apply罢浇、call的區(qū)別
從作用上看陆赋,兩者作用完全一樣,都是為了改變函數(shù)體內(nèi)this的指向嚷闭,唯一的區(qū)別就是兩者傳遞的參數(shù)不同奏甫,下面是一個函數(shù)的定義,
var func = function(arg1,arg2){
}
你可以通過如下的方法來調(diào)用
func.call(this,arg1,arg2);
func.apply(this,[arg1,arg2]);
其中凌受,this指的是你要指定的上下文阵子,call和apply的區(qū)別就是call是把參數(shù)按順序傳進(jìn)去,apply則傳入的是一個參數(shù)數(shù)組,有時候也可以直接傳入arguments對象胜蛉。
接下來介紹一下call和apply的用法示例挠进,以便更近一步的了解
- 數(shù)組的追加
var array1 = [12 , "foo" , {name:"Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2); //輸出array1的值為[12,"foo",{name:"Joe"},-2458,"Doe",555,100]
- 獲取數(shù)組中的最大值或最小值
var array = [-1245,96,788,35];
Math.max.apply(Math,array); //結(jié)果為788
本來number沒有求解最大值最小值的方法,但Math有誊册,通過apply將Math.max()方法應(yīng)用到數(shù)組上领突,大大為我們提供了方便。