2013-03-20 110 views
2

我有一個對象,生成的HTML元素也與對象的數組連接,讓我們說我們有一個它的實例。所以當它創建元素時,它還會將以下事件偵聽器分配給元素的嵌套部分(類爲uploadDelete)。removeEventListener與唯一匿名函數

現在,此事件偵聽器需要調用創建它的對象實例的delete方法,並在創建時指定i的值。由於事件在Window下,因此需要將實例與i值一起傳遞給匿名函數。

因此,這爲事件分配了一個非常獨特的函數,並且因爲delete方法將銷燬包含偵聽器的元素,所以我希望先刪除它;從我讀過的話可能會導致泄漏,否則(?)。我也使用嚴格模式,所以不使用arguments.callee。

file.display.getElementsByClassName('uploadDelete')[0].addEventListener('click', 
(function(that,i){ 
    return function() { 
     that.delete(i); 
    }; 
})(this,i), false); 

我已經嘗試了很多不同的東西,但是當我開始有一個功能,然後將其稱爲聽者的內部函數內部的匿名函數,我想我應該只問就在這裏。我可能會解決整體問題,改變其他代碼,但如果能夠回答這個問題,它仍然有幫助。


下面是我最終在Norguard的答案幫助下做的。由於獨特性是從一個對象調用的文件而產生的,我剛剛創建的文件的一個新的屬性來存儲功能:

file.deleteFunction = (function(that,i){ 
    return function() { 
     that.delete(i); 
    }; 
})(this,i); 

file.display.getElementsByClassName('uploadDelete')[0].addEventListener('click',file.deleteFunction, false); 

刪除功能被調用,然後刪除該事件監聽器。

回答

2

一個相對無痛的做法可能是在作用域中創建一個對象,該對象負責添加和刪除偵聽器,這些偵聽器構建一個ID,串行或非ID,並將存儲監聽器在對象中的任何內容該ID將ID返回給任何請求它的對象/模塊(或將匿名函數傳回給它們)。

// trivial example 
var listeners = {}, 
    i = 0, 


add = function (context, func, closure) { 
    var enclosed = (function (closure) { 
     return function() { /* ... */; func(); }; 
    }(closure)), 
    index = i; 

    context.addEventListener("...", enclosed, false); 
    listeners[index] = enclosed; 
    i += 1; 
    return index; 
}; 

add現在將添加監聽器,但也將存儲你傳遞的addEventListener到listeners對象的功能。 如果您需要對i的引用,那麼您已經在關閉中找到了它,如果需要的話。

所以現在當你刪除的東西,你可以尋找保存在listeners[i]功能。

如果您不想在任何一個地方保存一張滿滿的這樣的表格,不管出於何種原因,都會捕獲返回語句,而不是返回i,而是返回該函數;

// inside of your module 
// I'm not usually crazy about `this`, without doing something particular with it, 
// but hopefully it illustrates my point 
this.cached_func = add(this.el, this.callback.bind(this), this.secret); 
現在

所以,當談到時間刪除一切,你要關閉你的聽衆......

remove(this.cached_func); 

所有這一切說的,你讀過有關的泄漏是仍然有可能,但主要的罪魁禍首是IE6/7(及更早)。
隨着人們遠離惡意瀏覽器,這變得不那麼重要。
事實上,鼓勵IE6中的內存轉儲可能只是鼓勵人們不使用IE6的一種好方法。

+0

這與我開始考慮的事情類似。感謝您的答覆,並清除這些事情! – 2013-03-21 21:04:00