SetTimeout создает ошибку области

Мой вопрос прост. Я использую setTimeout внутри цикла for, во время выполнения возникает ошибка:

Uncaught TypeError: Cannot call method 'setAttribute' of undefined

Мой опыт работы с javascript тонкий (я пропускаю jQuery ради обучения), и я предполагаю, что это имеет что-то с тем, как я называю setTimeout.

Взгляните на мою функцию, я хотел бы знать, почему "элементы" недоступны изнутри анонимной функции.

function hide_visable_elements()
{
 // remove body EventListener
 var body = document.getElementsByTagName("body");
 body[0].removeEventListener("click", hide_visable_elements, true);

 var elements = document.getElementsByClassName("visible");
 for (var i = 0; i < elements.length; ++i)
 {
 elements[i].removeAttribute("class");
 setTimeout(function() { elements[i].setAttribute("class", "hidden") }, 300);
 } 
}
1 ответ

Вот пример того, как вы могли бы захватить текущее значение итерации так, чтобы, когда он выполняется после завершения цикла (он всегда после, из-за асинхронного характера), он будет поступать правильно:

function setHidden(element) {
 return function() {
 element.setAttribute("class", "hidden");
 };
}

function hide_visable_elements() {
 // remove body EventListener
 var body = document.getElementsByTagName("body");
 body[0].removeEventListener("click", hide_visable_elements, true);
 var elements = document.getElementsByClassName("visible");
 for (var i = 0; i < elements.length; ++i) {
 elements[i].removeAttribute("class");
 setTimeout(setHidden(elements[i]), 300);
 }
}

Btw Я использую описание "long after" относительно, минимальное количество времени, которое проходит до того, как ваши отложенные функции могут быть выполнены, составляет 4 или 13 миллисекунд, но время выполнения цикла измеряется в микро или наносекундах.

licensed under cc by-sa 3.0 with attribution.