我的問題很簡單。我使用的是內部的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