Javascript中函數天生具有的兩個方法
Javascript的函數有兩個共同的方法:apply()和call()。兩個方法的目的是一樣的,只是在具體用法有所區別。
這兩個方法都調用了函數,并且第一個參數指定了函數體中this所代表的對象。
區別在于apply()的第二個參數是函數調用時的參數,可以是一個數組也可以是一個arguments對象。
例子:
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作為第二個參數。callSum2使用了一個數組作為參數參數,這兩種使用方法都是有效的。另外,兩個函數中的this實際上指向了window對象,因為這兩個函數都是在全局中被調用的。
call()的用法和apply()相似,只是在傳參的有不同。它的第一個參數還是this,但是剩下的參數會被直接傳入參數。也就是說,apply()只會有兩個參數,而call()可以有N個參數。
例子:
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
為了達到和最上面的兩個方法(callSum1和callSum2)一樣的效果,callSum必須將自己的每個參數都傳遞進call()中作為參數。
具體使用call()還是apply()要取決于具體情況。如果只傳第一個參數,call()和apply()的效果是一樣的。
上面介紹了call()和apply()的基本用法,下面來說說他們真正強大的地方。
它們真正強大的地方不在于它們傳遞參數的能力,而在于它們增強了函數體中this的能力。
看下面這個例子:
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()函數體中使用了this這個關鍵詞,當它在全局范圍被單獨調用的時候,這個this指的就是window,但是當它通過call()方法被調用的時候,這個this指的就是call()中的第一個參數,因此,當call()中的第一個參數不一樣的時候,函數體中this所指向的對象就不一樣,造成的結果也就不一樣,因此增強了函數的使用方式和開發者的遐想空間。