下面的代码按预期工作。For循环与setTimeout不按预期方式工作
var mySelector = document.querySelectorAll('.mySelector');
var myFunction = function() {
for (var i = 0; i < mySelector.length; i++) {
mySelector[i].classList.add('myClass');
}
}
但是,此代码生成错误:“遗漏的类型错误:无法读取属性未定义‘班级列表’”
var mySelector = document.querySelectorAll('.mySelector');
var myFunction = function() {
for (var i = 0; i < mySelector.length; i++) {
setTimeout(function(i){
mySelector[i].classList.add('myClass');
}, 1000);
}
}
我敢肯定,有一个很简单的解释这是为什么,但我不知道。
为什么?
更新:新代码的参数从setTimeout函数删除
var mySelector = document.querySelectorAll('.mySelector');
var myFunction = function() {
for (var i = 0; i < mySelector.length; i++) {
setTimeout(function(){
mySelector[i].classList.add('myClass');
}, 1000);
}
}
更新2:
Barmar认为这是另一个问题的精确副本:JavaScript closure inside loops – simple practical example
我承认,这是一般类似的,Barmar联系的答案可能可以帮助那些在我面临的问题上有更多JavaScript体验的人。但我认为我的问题不同于以自己的条件保持开放,原因如下:(1)我的案例更简单,正确的答案可能有利于技能较低的JavaScript实践者(如我),(2)我特别与setTimeout有关,因为它与for循环有关。再次,我会批准Barmar引用的答案可能对许多人有所帮助,但对我个人来说并不是特别有用。
对不起,我删除了我的答案,因为它是在黑暗中拍摄。自从我写Javascript以来已经有一段时间了。 – Carcigenicate