2012-12-06 23 views
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访问不是适当的对象,并以某种方式与预期的方式有所不同。有人能解释会发生什么吗?当然,我错过了一些东西。

在此先感谢。

回答

0

两个thatmyPrivateCode是提供给您的事件处理程序通过closure。总之,发生的事情是你在另一个函数中声明的每个变量和函数都可以访问外部范围。

myPublicCode另一方面,通过关闭不可用,因为它专门分配给您的module对象。所以唯一的方法是使用module.myPublicCode()(或that.myPublicCode(),因为您的确是–,但实际上您并不需要that,因为module也可用)。

+0

谢谢。现在很清楚。 – Stan

0

myPrivateCode(e.target);的呼叫在作为处理程序传递给click函数的匿名函数的上下文中运行。请致电closures

对于一个简单的例子,试试这个代码:

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/

+0

请问您能更具体吗?我知道关闭。 – Stan

+0

我还不清楚为什么''那个公共和私人方法的工作方式不同? – Stan

+0

当您编写'module.myPublicCode'时,您将'myPublicCode'函数添加为'that'的属性。在这种情况下,'这===这个===模块'。 – jbabey

相关问题