[英]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
,你的處理程序是關閉的函數。
that
和myPrivateCode
都可以通過閉包供您的事件處理程序使用。 簡而言之,發生的事情是您在另一個函數內部聲明的每個變量和函數都可以訪問外部范圍。
另一方面, myPublicCode
不能通過閉包使用,因為它被專門分配給您的module
對象。 因此,調用它的唯一方法是使用module.myPublicCode()
that.myPublicCode()
或像您所做的那樣使用 that.myPublicCode() - 但您實際上並不需要that
,因為module
也可用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.