JavaScript中每個函數都包含兩個非繼承而來的方法,分別是apply()和call()。這兩個方法都是用來在特定的作用域中調用函數,即改變函數體內this對象的值。
apply()方法接受兩個參數:1、在其中運行函數的作用域2、參數數組。call()方法與apply()方法的作用是相同的,區別僅在於接受參數的方式不同。對於call()方法,第一個參數是相同的,而第二個參數是直接傳遞給函數的。例如:
function add(num1,num2){
return num1+num2;
}
function applyAdd(num1,num2){
return add.apply(this,[num1,num2]); //傳入參數數組
}
function callAdd(num1,num2){
return add.call(this,num1,num2); //傳入參數值
}
alert(applyAdd(10,10));
alert(callAdd(10,10));
實際上,call()和apply()的作用不僅僅是傳遞參數,它們的強大之處在於擴充函數賴以運行的作用域,好處是對象不需要和方法有任何的耦合關係。例如:
window.size="big";
var a={size:"small"};
function saySize(){
alert(this.size);
}
saySize(); //big
saySize.apply(this); //big
saySize.call(window); //big
saySize.call(a); //small
saySize.bind(a)(); //small
上面我們用到了bind()方法,這個方法會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值。從這裏。我們可以看出bind()與以上兩個方法的區別,call()和apply()是對函數的直接調用,而bind()方法返回的是一個函數,因此後面還需要()來進行調用纔可以使用。