Javascript:其他异步函数中的异步嵌套函数给出了意外的结果

标签 javascript ajax asynchronous nested

我有两个异步函数,一个嵌套在另一个中,如下所示:

  //Async 1
  document.addEventListener("click", function(event){
     for (var i in event){
        //Async 2
        setTimeout(function(){
           console.log(i);
        }, 200*i);
     }
  });

我想要的是能够打印 event 对象的每个条目(i)。然而 Firefox 上的输出是这样的:

MOZ_SOURCE_KEYBOARD
MOZ_SOURCE_KEYBOARD
MOZ_SOURCE_KEYBOARD
MOZ_SOURCE_KEYBOARD
..

如果我将 console.log(i) 移到 Async 2 之外,那么我会得到正确的结果:

type
target
currentTarget
eventPhase
bubbles
cancelable
..

为什么在读取async 2中的i时无法正常工作? event 不应该在整个 Async 2 代码块中“事件”吗?

最佳答案

setTimeout 使用 async1 中出现的 i。也就是说,在创建超时函数时,它引用 i 而不是使用 i 的值。当超时函数最终运行时,它会查看 i 的当前值,这是 for 循环之后 event 中的最后一个键。

您可以通过使用自调用函数来避免这种情况,这样该函数的参数对于超时函数来说是本地的:

for (var i in event) {
    setTimeout((function(i) {
        return function() { console.log(i); }
    })(i), 200 * i);
}

关于Javascript:其他异步函数中的异步嵌套函数给出了意外的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982918/

相关文章:

javascript - 登录失败时不刷新

Javascript/AJAX 异步加载旋转器

JavaScript 执行引擎未指定?

javascript - 如何访问 polymer 中的属性值?

javascript - 如何使用 jQuery 在键盘上为 Div 列表启用箭头导航

javascript - 使用 casperjs 从 slidify (HTML5) 幻灯片生成 pdf 时缺少图像

multithreading - 如何在 Rust 中进行 "fire and forget"调用?

javascript - 使用redux,如何避免在进行新的API调用之前渲染旧的状态数据?

php - 通过ajax同时在多个数据库中执行更新查询

javascript - 查询。使用 ajax 调用在 .each 循环之后调用函数