簡體   English   中英

從事件處理程序閉包訪問公共和私有方法

[英]Access to public and private methods from event handler closure

我很難理解我當前的 JavaScript 代碼是如何工作的。 我已經設法解決了從事件處理程序閉包訪問私有對象方法的問題,但我想知道為什么它會這樣工作。

該代碼使用了眾所周知的模塊/插件隱喻:

(function(module, $, undefined)
{
  function myPrivateCode(e){ /*...*/ }

  module.myPublicCode = function(e) { /*...*/ }

  module.init = function()
  {
    var that = this;
    $('.clickable').click(function(e)
    {
      if($(e.target).hasClass('classX'))
      {
         that.myPublicCode(e.target); // requires 'that' to work
      }
      else
      {
         // that.
         myPrivateCode(e.target);     // will fail if 'that' uncommented
      }
    });
  }

}(window.module = window.module || {}, jQuery ));

在代碼中,我設置了一個調用公共或私有方法的點擊處理程序。 完全可以想象,我們需要將對象引用傳遞到事件處理程序閉包中,這是由that局部變量完成的。 令我感到奇怪的是myPrivateCode既不需要that作為參考,也不會因為它的“隱私”而失敗。 這讓我認為myPrivateCode訪問的不是適當的對象,並且以某種方式與預期的方式不同。 有人可以解釋發生了什么嗎? 當然我錯過了一些東西。

您對myPrivateCode(e.target); 在您作為處理程序傳遞給click函數的匿名函數的上下文中運行。

有關更多信息,請閱讀閉包

舉一個更簡單的例子,試試這段代碼:

var foo = function () {
    var a = 1;

    return function (b) {
        return a+b;
    }
};

var bar = foo();

bar(1); // 2

bar(1)將始終給出 2,因為創建函數時a = 1在范圍內。 在你的情況下, a是你的that ,你的處理程序是關閉的函數。

http://jsfiddle.net/Fh8d3/

thatmyPrivateCode都可以通過閉包供您的事件處理程序使用。 簡而言之,發生的事情是您在另一個函數內部聲明的每個變量和函數都可以訪問外部范圍。

另一方面, myPublicCode不能通過閉包使用,因為它被專門分配給您的module對象。 因此,調用它的唯一方法是使用module.myPublicCode() that.myPublicCode()或像您所做的那樣使用 that.myPublicCode() - 但您實際上並不需要that ,因為module也可用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM