我正在嘗試構建一個類似jQuery.live的函數。 Helper
是具有_liveEvent
和_addEventListener
方法的類。 Helper._addEventListener
只是W3C addEventListener
的CrossBrowser版本。我是否需要在DOM事件回調中使用閉包?
Helper.prototype._liveEvent = function(type, evt, ofunc) {
var elHand = document;
type = type.toUpperCase();
this._addEventListener(elHand, evt, function(me) {
// Inside here I use the `type` variable.
// I don't know why but it works.
for (var el = me.srcElement; el.nodeName !== 'HTML';
el = el.parentNode)
{
if (el.nodeName === type || el.parentNode === null) {
break;
}
}
if (el && el.nodeName === type) {
ofunc.call(el, me);
}
});
};
我使用不同類型的Helper._liveEvent
函數運行2次。它工作得很好。我認爲,因爲type
變量設置在_liveEvent
的上下文中,所以_addEventListener
回調只能看到該變量的最後一個版本。但情況並非如此,它似乎工作正常。
我的問題是:
- 爲什麼_addEventListener回調可以看到類型的兩個版本?
- 這是否意味着我的代碼正在泄漏內存?
UPDATE
這另一個例子讓我明白這更好。但我還不確定我是否有這個想法。
function foo(i) {
setTimeout(function() {
console.log(i);
}, 400);
}
// Prints 1, 2, 3
for (var i = 1; i < 4; i++) {
foo(i);
}
function bar() {
for (var i = 1; i < 4; i++) {
setTimeout(function() {
console.log(i);
}, 400);
}
}
// Prints 4, 4, 4
bar();
我認爲這個變量具有正確的範圍,因爲我多次輸入了多次_liveEvent,而不是因爲我多次創建了一個匿名函數。 – Eduardo 2012-02-19 16:35:32
這裏是一樣的東西(注意_「每個都有自己的'elHand'和'type'」_提示多個'_liveEvent()'調用)。通過對'_addEventListener()'的兩次連續調用添加的監聽器是兩個不同的Function對象。 – 2012-02-19 16:40:59
看看我的第二個例子。有超時的那個。 foo和bar都有多個匿名函數,但只有一個可以工作。範圍由foo函數參數保存,而不是由創建的匿名函數 – Eduardo 2012-02-19 16:44:47