我正在尝试构建一个类似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