昨天看到這篇文章 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方法。原作者的舉例不太恰當吧。