2012-02-11 66 views
1

這裏是說明導致我在這裏問一個問題的情況一個抽象的JavaScript代碼示例:JavaScript:使用'this'調用函數。不參照方法類

function className(){  
    var private_variable = 0;   
    function privateMethod(){ 
     // Some irrelevant code. 
    };  
    this.privilegedMethod = function(){ 
     // Some relevant code to determine if private variable needs to be modified. 
     private_variable+=val; // Modifies private variable. 
    };  
    this.init = function() { 
     $(window).keydown(function (key) { 
      if (key.which == 13) { 
       privateMethod(); // Call to private method works fine. 
       this.privilegedMethod(); // 'this' references Window object, 
              // not this class method as expected. 
      } 
     }); 
    }; 
}; 

我的問題是 - 是否有其他辦法可以讓通話this.privilegedMethod()引用它的類,而不是它應用於的Window對象?

或者可能有任何建議我可以重組我的代碼保持功能 - 關鍵事件是全局聆聽的,修改私有變量的方法可以在類外部訪問,但私有變量本身不是。

P.S.將該調用放置在私有內部的特權方法中並沒有改變任何內容。

回答

5
this.init = function() { 
    var that = this; 
    $(window).keydown(function (key) { 
     if (key.which == 13) { 
      privateMethod(); 
      that.privilegedMethod(); 
     } 
    }); 
}; 

this.init = function() { 
    $(window).keydown($.proxy(function (key) { 
     if (key.which == 13) { 
      privateMethod(); 
      this.privilegedMethod(); 
     } 
    }, this)); 
}; 
+0

謝謝你的快速響應;奇蹟般有效。 – user1203684 2012-02-11 12:45:06

+0

如果他回答了你的問題,請標記爲已回答 – Paul 2012-02-11 12:50:38

+1

我認爲「自我」對於以這種方式使用的變量來說是一個更好的名稱,因爲它是其他語言使用的而不是「this」,所以更具代表性。 – 2012-02-11 12:52:35

1

這筆交易是該keydown處理程序內的範圍是窗口對象,所以「this」關鍵字是指沒有你方法關閉窗口。

James解決方案應該可以正常工作。

0
function className(){  
    var private_variable = 0;   
    function privateMethod(){ 
     // Some irrelevant code. 
    };  
    this.privilegedMethod = function(){ 
     // Some relevant code to determine if private variable needs to be modified. 
     private_variable+=val; // Modifies private variable. 
    };  

    this.init = function() { 
     var handle = $.proxy(this.privilegedMethod, this); 
     $(window).keydown(function (key) { 
      if (key.which == 13) { 
       privateMethod();  
       handle();             
      } 
     }); 
    }; 
}; 

http://api.jquery.com/jQuery.proxy/

相關問題