call()和apply()的理解

談一談js中call()和apply()方法

在最近看的js書中,提及到了,Math對象,有max和min方法,當我們想要將這個方法適用數(shù)組的時候可以這樣適用。

var value = [1,2,3,4,5]
var max = Math.max.apply(Math,values);

之前對apply和call的只是知道是一種繼承的方式,但是并沒有深入,理解,于是我決定仔細研究研究。

call, apply都屬于Function.prototype的一個方法,它是JavaScript引擎內(nèi)在實現(xiàn)的,因為屬于Function.prototype,所以每個Function對象實例,也就是每個方法都有call, apply屬性.既然作為方法的屬性,那它們的使用就當然是針對方法的了.這兩個方法是容易混淆的,因為它們的作用一樣,只是使用方式不同.

call方法:
語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明:
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。
如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj。

apply方法
語法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
說明:
如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數(shù),那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數(shù)

相同點:兩個方法產(chǎn)生的作用是完全一樣的。
不同點:方法傳遞的參數(shù)不同。
function Animation(){
     this.name = "Animal";    
     this.showName = function(){    
        console.log(this.name);    
    }    
}

function Cat(){
    this.name = 'Cat';
}

let cat = new Cat();
let animation = new Animation();

animation.showName.apply(cat);

從結果中可以看出call和apply都可以讓Cat對象調用Animation對象的showName方法,并且修改了this的當前作用對象。

畫重點
|

每個函數(shù)都包含兩個非繼承而來的方法:apply()和call()。

他們的用途相同,都是在特定的作用域中調用函數(shù)。

接收參數(shù)方面不同,apply()接收兩個參數(shù),一個是函數(shù)運行的作用域(this),另一個是參數(shù)數(shù)組。
call()方法第一個參數(shù)與apply()方法相同,但傳遞給函數(shù)的參數(shù)必須列舉出來

eg:

window.firstName = "diz"; 
window.lastName = "song"; 
var myObject = { firstName: "my", lastName: "Object" }; 
function HelloName() { 
  console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!"); 
} 
HelloName.call(window); //huo .call(this); 
HelloName.call(myObject); 

運行結果如下:

Hello diz song glad to meet you! 
Hello my Object glad to meet you! 

其實不難發(fā)現(xiàn)apply()和call()的真正用武之地是能夠擴充函數(shù)賴以運行的作用域

因此在es5中有bind()方法
eg:

window.color = "red"; 
var o = { color: "blue" }; 
function sayColor(){ 
alert(this.color); 
} 
var OSayColor = sayColor.bind(o); 
OSayColor(); //blue
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容