我的问题很简单。我使用的是内部的for循环的setTimeout,运行时 错误过程中产生曰:setTimeout产生范围错误
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);
}
}
您推迟的函数在循环完成后执行很长时间,此时'i === elements.length'和'elements [i]'当然是'undefined',因为它超出了边界的访问范围。 – Esailija
那我该如何达到所需的延迟呢?根据你所说的话,如果我将300ms改为0ms,它应该可以工作,但不是。 –
在你推迟一个函数之前,在那个时候捕获'i'的值,这样当函数最终执行时,它将使用你捕获的值而不是当前的任何'i'。这与毫秒数毫无关系,任何数量都会在循环执行后长时间执行。 – Esailija