js中this的四種調用模式


在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

 


免責聲明!

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



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