在javascript中一共有四種調用模式:方法調用模式,函數調用模式,構造器調用模式,apply調用模式
這些模式在如何初始化關鍵參數this上存在差異。
1 方法調用模式(也就是用"."的方式來調用的)
當一個函數被保存為對象的一個屬性時,我們稱它為一個方法。當一個方法被調用時,this被綁定到該對象。如果一個調用表達式包含一個屬性存取表達式(即一個.點表達式或者[subscript]下標表達式),那么它被當做一個方法來調用
var myObject = {
value :0;
increment:fucntion (inc){
this.value += typeof inc ==='number' ? inc:1;
}
};
myObject.increment();
document.writeln(myObject.value); //1
myObject.increment(2);
document.writeln(myObject.value); //3
方法可以使用this去訪問對象,所以它能從對象中取得或修改該對象。this到對象的綁定發生在調用的時候。這個“超級”遲綁定( very late binding)使得函數可以對this高度復用。通過this可取得它們所屬對象的上下文的方法稱為公共方法。
2 函數調用模式
當一個函數並非一個對象的屬性是,那么它被當做一個函數來調用:
var sum = add(3,4); //sum的值為7
當函數以此模式調用時,this被綁定到全局對象。這是語言設計上的一個錯誤,倘若語言設計正確,當內部函數被調用時,this應該仍然綁定到外部函數的this變量。這個設計錯誤錯誤的后果是方法不能利用內部函數來幫助它工作,因為內部函數的this被綁定了錯誤的值,所以不能共享該方法對對象的訪問權。幸運的是,有一個很容易的解決方案:如果該方法定義一個變量並給他賦值為this,那么內部函數就可以通過那個變量訪問到this。
//給myObject增加一個double方法
myObject.double = function(){
var that = this; //解決方案
var helper = function(){
that.value = add(that.value,that.value);
};
helper();//以函數的形式調用helper
};
//以方法的形式調用double
myObject.double();
document.writeln(myObject.getValue()); //6