方法定義
call方法:
文法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明:
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的物件內容從初始的上下文改變為由 thisObj 指定的新對象。
如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。
apply方法:
文法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
說明:
如果 argArray 不是一個有效數組或者不是 arguments 對象,那麼將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數
call與apply可以算的上是進階應用程式,如果有看過JQuery代碼的人就知道,這兩個方法在JQuery應用很多包括外掛程式機制,事件,迴圈等)。它的主要功能就是改變了調用方法的this。
例如
function test(){
alert(this.nodeName);
}
在一般的通過test()使用中來看上面的函數會顯示undefined
但是如果我們使用這兩個方法結果可能就不一樣了
如test.call(document.body)或test.apply(document.body)顯示的內容就是 BODY
可能不好理解,其實可以這樣說:
當使用test()時 this=test
當使用test.call(document.body)或test.apply(document.body)時 this=document.body
雖然上面的文法不對,但可以形象的說明call與apply就是改變了this的值,通過物件導向的思想說就是改變了this的引用,也就等於調用test時使用了document.body對象,同等於給document.body對象添加了一個test方法,這種擴充可以批量擴充同一個方法,而且是動態擴充。當然如果方法內沒有使用this那使用call與apply意義不大。
結論:call與apply改變this指向傳入的第一個參數沒有傳入則是Global對象,後經測試就是window對象),第二個參數及以後都是調用這個方法的傳參。
技術有限,如果有不當之處還請指正。
本文出自 “web中的php” 部落格,請務必保留此出處http://php2012web.blog.51cto.com/5585213/1286837