Я играл (читай: учился) с Javascript и наткнулся на что-то, насколько я понимаю, кажется очень странным. Это связано с замыканиями и ссылкой, которая, кажется, теряет свою важность для браузера.
Используемый мной браузер: Chromium 5.0.307.7 .
В любом случае, вот код:
HTMLElement.prototype.writeInSteps = function() {
var i = 0;
var elem = this;
var args = arguments;
function step() {
elem.innerHTML += args[i];
if(i < args.length) {
i += 1;
} else {
elem.innerHTML = "";
i = 0;
}
setTimeout(step, 500);
}
step();
}
Здесь происходит то, что первый аргумент записывается в правильный HTMLElement, а все последующие - нет. Похоже, что после первого аргумента следующие аргументы записываются в какой-то другой элемент, на который теперь ссылается 'elem'.
Я должен также упомянуть, что, кажется, это происходит только тогда, когда я пишу что-то непосредственно после вызова этой функции, например:
div.writeInSteps("This", " is", " not", " working");
$id("body").innerHTML += "Doh!";
Если я воздерживаюсь от написания чего-либо после вызова этой функции, похоже, она работает нормально.
Если я вместо этого изменю код выше на:
HTMLElement.prototype.writeInSteps = function() {
var i = 0;
var e = this.id;
var args = arguments;
function step() {
var elem = $id(e);
elem.innerHTML += args[i];
if(i < args.length) {
i += 1;
} else {
elem.innerHTML = "";
i = 0;
}
setTimeout(step, 500);
}
step();
}
Все денди. Мой вопрос: что на самом деле происходит за кулисами в первой версии?
РЕДАКТИРОВАТЬ : Обновлено с запрошенными подробностями о "... написать что-то сразу после ..." и использовании браузера в соответствии с запросом ntownsend Брайан Мэтьюз , я не уверен, как предоставить тестовую страницу, не делая этот вопрос чрезмерно загроможденным.