javascript - For 循环中的 jQuery 和 setTimeout

标签 javascript jquery for-loop settimeout

<分区>

我刚刚遇到了一个非常奇怪的问题(虽然我修复了它)但我想知道为什么它首先会发生:

function stuffAppear() {
    var i;
    for (i = 0; i < speech.length; i++) {
        apperance(i);
    }
}
function apperance(i) {
    var x = speech[i];
    setTimeout(function() {$(speech[i]).fadeIn(1000); console.log(i);}, 1000 + i * 1500);
    console.log(speech[i]);
}

控制台日志显示“#yo0”然后是“#ma0b”(这是必需的)但与此同时,它们从未消失

我一直在研究代码,直到我得到这个:

function stuffAppear() {
    var i;
    for (i = 0; i < speech.length; i++) {
        apperance(i);
    }
}
function apperance(i) {
    var x = speech[i];
    setTimeout(function() {$(x).fadeIn(1000); console.log(i);}, 1000 + i * 1500);
}

这就成功了,但我不知道为什么第一个代码不起作用。有人可以向我解释一下吗? 谢谢!

最佳答案

在 JSFiddle 中,两个版本都工作正常(并且相同):

第一个:http://jsfiddle.net/TrueBlueAussie/Bkz55/3/

var speech = ["#yo0", "#ma0b", "#blah"];

function stuffAppear() {
    var i;
    for (i = 0; i < speech.length; i++) {
        apperance(i);
    }
}
function apperance(i) {
    var x = speech[i];
    setTimeout(function() {$(speech[i]).fadeIn(1000); console.log(i);}, 1000 + i * 1500);
    console.log(speech[i]);  // <<< THIS WOULD OCCUR IMMEDIATELY
}

第二个:http://jsfiddle.net/TrueBlueAussie/Bkz55/4/

var speech = ["#yo0", "#ma0b", "#blah"];

function stuffAppear() {
    var i;
    for (i = 0; i < speech.length; i++) {
        apperance(i);
    }
}
function apperance(i) {
    var x = speech[i];
    setTimeout(function() {$(x).fadeIn(1000); console.log(i);}, 1000 + i * 1500);
}

所以我怀疑您所看到的是其他代码(未显示)的副作用。

唯一奇怪的是你在第一个版本中登录了两次(一次在开始时显示的 setTimeout 之外——正如你提到的)

跟进:

现在看到了真正的代码,原因是在超时期间更改了 speech 数组。当最终触发超时函数时,speech 数组为空!

关于javascript - For 循环中的 jQuery 和 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22891635/

相关文章:

php - Ajax 函数找不到正确的数据

javascript - 在输入字段上获取 quaggaJS 条形码结果

javascript - 将 IEnumerable<int> 分配给隐藏的 for

javascript - Kendo 网格更改样式单元格数据

javascript - jQuery 多层 JSON

ios - 全新项目 View Controller 上有 2 个 "hidden"按钮

JavaScript HTML 注入(inject)错误

javascript - 如何删除 for 循环的第一部分?

c - 为什么多个 if 语句比执行 while 循环更快?

javascript - 从日期列表中删除破折号