Javascript中函數(shù)天生具有的兩個(gè)方法
Javascript的函數(shù)有兩個(gè)共同的方法:apply()和call()。兩個(gè)方法的目的是一樣的,只是在具體用法有所區(qū)別。
這兩個(gè)方法都調(diào)用了函數(shù),并且第一個(gè)參數(shù)指定了函數(shù)體中this所代表的對(duì)象。
區(qū)別在于apply()的第二個(gè)參數(shù)是函數(shù)調(diào)用時(shí)的參數(shù),可以是一個(gè)數(shù)組也可以是一個(gè)arguments對(duì)象。
例子:
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments); //passing in arguments object
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]); //passing in array
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
上面的例子中,callSum1使用了arguments作為第二個(gè)參數(shù)。callSum2使用了一個(gè)數(shù)組作為參數(shù)參數(shù),這兩種使用方法都是有效的。另外,兩個(gè)函數(shù)中的this實(shí)際上指向了window對(duì)象,因?yàn)檫@兩個(gè)函數(shù)都是在全局中被調(diào)用的。
call()的用法和apply()相似,只是在傳參的有不同。它的第一個(gè)參數(shù)還是this,但是剩下的參數(shù)會(huì)被直接傳入?yún)?shù)。也就是說(shuō),apply()只會(huì)有兩個(gè)參數(shù),而call()可以有N個(gè)參數(shù)。
例子:
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
為了達(dá)到和最上面的兩個(gè)方法(callSum1和callSum2)一樣的效果,callSum必須將自己的每個(gè)參數(shù)都傳遞進(jìn)call()中作為參數(shù)。
具體使用call()還是apply()要取決于具體情況。如果只傳第一個(gè)參數(shù),call()和apply()的效果是一樣的。
上面介紹了call()和apply()的基本用法,下面來(lái)說(shuō)說(shuō)他們真正強(qiáng)大的地方。
它們真正強(qiáng)大的地方不在于它們傳遞參數(shù)的能力,而在于它們?cè)鰪?qiáng)了函數(shù)體中this的能力。
看下面這個(gè)例子:
window.color = “red”;
var o = { color: “blue” };
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
sayColor()函數(shù)體中使用了this這個(gè)關(guān)鍵詞,當(dāng)它在全局范圍被單獨(dú)調(diào)用的時(shí)候,這個(gè)this指的就是window,但是當(dāng)它通過(guò)call()方法被調(diào)用的時(shí)候,這個(gè)this指的就是call()中的第一個(gè)參數(shù),因此,當(dāng)call()中的第一個(gè)參數(shù)不一樣的時(shí)候,函數(shù)體中this所指向的對(duì)象就不一樣,造成的結(jié)果也就不一樣,因此增強(qiáng)了函數(shù)的使用方式和開(kāi)發(fā)者的遐想空間。