Я пытаюсь создать функцию, подобную jQuery.live.
Helper
- это класс с методами _liveEvent
и _addEventListener
. Helper._addEventListener
- это просто версия CrossBrowser W3C addEventListener
.
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();