2012-12-06 20 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

相關問題