代码外部循环首先执行

时间:2013-11-28 19:12:44

标签: javascript jquery

我有12个彩色方块,当点击一个按钮时,随机选择6个,背景颜色变为黑色。

正方形都在同时改变颜色,直到我添加了setTimeout函数,该函数修复了该问题但又引起了另一个问题 - 循环之外的代码正在循环之前执行,即调用Reset函数和警报。

for (var i = 0; i < 6;i++)
{
setTimeout(function () 
{
  var rand = arr[Math.floor(Math.random() * arr.length)];       
  var square = document.getElementById('square' + rand);
  square.style.background="black";
},1000 * i);
}

Reset()
alert("Reset function")

我认为setTimeout函数以某种方式导致这种情况 - 有没有办法解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用闭包应解决您的问题:

var length = 6;

for (var i = 0; i < length ; i++)
(function (i) {
    setTimeout(function () {
        var rand = arr[Math.floor(Math.random() * arr.length)];
        var square = document.getElementById('square' + rand);
        square.style.background = "black";
        if (i === length - 1) Reset();

    }, 1000 * i);
})(i);


function Reset() {
    alert("Reset function")
}

答案 1 :(得分:0)

如果我不得不猜测我会说错误是由你的for循环周围缺少花括号引起的。在setTimeout之前和循环的最后一部分之后应该有一个{或}