javascript - 循环和范围解析问题中的 setTimeout

标签 javascript scope window sencha-touch settimeout

<分区>

Possible Duplicate:
How to Use setTimeout in a for…loop
calling setTimeout with a for loop

对我来说,setTimeout 函数在 for 循环中不起作用。它在所有 for 循环语句执行完后执行。

对于 javascript 中的 setTimeout 函数,我正面临这个范围问题。

这是我的代码片段..

 ... moves[] is an array ..

 for(i=0;i<noOfMoves;i++) {

        playerName = moves[i].playerName;
        timeDiff = moves[i].timeDiff;
        console.log("Inside for loop"+ playerName);

        setTimeout(function(){
             console.log("Inside set time out :"+playerName);
        },timeDiff);
 ....
 ....
}

但它笨拙地打印出以下输出......

 Inside for loopplayer1
 Inside for loopplayer2
 Inside for loopplayer3
 Inside for loopplayer4
 .... (noOfMoeves times .. )
 Inside set time outplayer1
 Inside set time outplayer1
 Inside set time outplayer1
 Inside set time outplayer1

编辑:

我想要以下方式的 o/p

我希望代码逐行执行。首先打印“Inside for loop”控制台日志,然后等待“timeDiff”期间,然后打印“Inside settimeout”功能控制台日志..我该怎么做? –

 Inside for loopplayer1
 Inside set time outplayer1 // (after waiting for timeDiff time)
 Inside for loopplayer2
 Inside set time outplayer2  // (after waiting for timeDiff time)
 ......
 ......

此外,playerName 变量在每个 settimeout 控制台日志语句中获得相同的值?

最佳答案

这不完全是因为闭包,这是因为 javascript 是单线程的,只有在 javascript 有空闲时间执行时才会设置 Timeout。 for 循环将始终在 setTimeout 执行其代码之前完成。

要解决这个问题,请像这样将所有内容放入 setInterval 中:

var moves = [{playerName:'Test'},{playerName:'Terry'}, {playerName:'sdfsdf'}];
var currIdx = 0;
var intervalId = window.setInterval(function () {
    var playerName = moves[currIdx].playerName;
    console.log("Inside for loop"+ playerName);
    (function(name) {
        setTimeout(function(){
             console.log("Inside set time out :"+name);
        },0);
    })(playerName);
    currIdx++;
    if(currIdx >= moves.length)
        window.clearTimeout(intervalId);        
}, 10);

请参阅 fiddle 示例 - http://jsfiddle.net/uTyVw/2/

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

相关文章:

javascript - 使用 jQuery 匹配表格单元格中的日期模式

Javascript正则表达式从字符串的开头删除除数字以外的任何内容

javascript - 需要用 Javascript 传入 url 变量来打开新的浏览器窗口

mysql - MYSQL8.0.11上窗口函数括号错误

java - 简单的 Java 用户界面

javascript - ionic 框架 3 : Splitting a long article page into small pages

javascript - Orchard 编辑器、图像选择器不起作用

javascript - JavaScript 如何解释作用域中的变量?

c# - 混合模式调试

ruby - 为什么尚未定义的局部作用域变量会引用同名实例变量?