解析js中的call


昨天看到這篇文章 http://uule.iteye.com/blog/1158829

里面講到call的使用方法,但是作者沒有講清楚里面的關系,我的理解是

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

原作者在這里舉例是如下的例子,他的解釋是: 這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果為:alert(4); // 注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。

function Add(a, b) {
alert(this); //輸出sub函數
alert(a + b);
}
function sub(a, b) {
alert(this);
alert(a - b);
}
Add.call(sub, 3, 1);

我在兩個函數之間加上了alert(this),其實這兩個函數Add和sub是屬於全局對象的,那么在此Add.call(sub, 3, 1);就相當於Window.Add.call(Window.sub,3,1)。這樣就很明顯了,call的意思是切換上下文,執行call時,上下文切換至Window.sub,可以用alert(this)來進行調試,上下文雖然切換了,但是還是調用的Window.Add。這樣理解就很清楚了。

如果不是很明白,請看下面的例子。

function Animal() {
this.name = "Animal";

this.Say = function () {
alert(this);
alert(this.name);
}
}

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

var animal = new Animal();
var cat = new Cat();
animal.Say.call(cat,",");

這里加入了一些alert,便於調試,alert(this);---alert(this.name);這樣的執行順序,調用animal.Say時上下文已經切換到cat對象,所以this就指向的cat,
this.name就等於Cat了。

再回頭看上面的,調用Add方法時,上下文切換至Sub方法,然並卵,還是執行的Add方法。原作者的舉例不太恰當吧。

 

參考:http://uule.iteye.com/blog/1158829


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM