JavaScript中apply()、call()和bind()的相似與區別

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()方法返回的是一個函數,因此後面還需要()來進行調用纔可以使用。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章