0

我很难理解我当前的 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访问不合适的对象,并且以某种方式与预期的方式不同。有人可以解释会发生什么吗?当然,我错过了一些东西。

4

2 回答 2

0

您的调用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/

于 2012-12-06T20:31:37.513 回答
0

两者thatmyPrivateCode都可以通过闭包供您的事件处理程序使用。简而言之,您在另一个函数中声明的每个变量和函数都可以访问外部作用域。

myPublicCode另一方面,不能通过闭包获得,因为它是专门分配给您的module对象的。所以调用它的唯一方法是使用module.myPublicCode()(或者that.myPublicCode()像你一样 - 但你实际上并不需要that那里,因为module它也可用)。

于 2012-12-06T20:37:59.683 回答