Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 首先执行循环外的代码_Javascript_Jquery - Fatal编程技术网

Javascript 首先执行循环外的代码

Javascript 首先执行循环外的代码,javascript,jquery,Javascript,Jquery,我有12个彩色方块,当点击按钮时,随机选择6个,背景颜色变为黑色 在我添加setTimeout函数之前,这些方块都是同时改变颜色的。setTimeout函数修复了这个问题,但导致了另一个问题——循环外的代码在循环之前执行,即调用重置函数和警报 for (var i = 0; i < 6;i++) { setTimeout(function () { var rand = arr[Math.floor(Math.random() * arr.length)]; var

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

在我添加setTimeout函数之前,这些方块都是同时改变颜色的。setTimeout函数修复了这个问题,但导致了另一个问题——循环外的代码在循环之前执行,即调用重置函数和警报

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")
for(变量i=0;i<6;i++)
{
setTimeout(函数()
{
var rand=arr[Math.floor(Math.random()*arr.length)];
var square=document.getElementById('square'+rand);
square.style.background=“黑色”;
},1000*i);
}
重置()
警报(“重置功能”)
我认为setTimeout函数是造成这种情况的原因——有没有办法解决这个问题


谢谢。

如果我不得不猜测的话,我会说错误是由于for循环周围缺少大括号造成的。在setTimeout之前和循环的最后一部分之后,应该有一个{or}

,如果我不得不猜测的话,我会说错误是由于for循环周围缺少大括号造成的。在setTimeout之前和循环的最后一部分之后,应该有一个{or}

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

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")
}
var长度=6;
对于(变量i=0;i
使用闭包应该可以解决您的问题:

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")
}
var长度=6;
对于(变量i=0;i
这不是超时的目的吗?说真的,我不理解你的问题,因为你所描述的正是超时的目的,延迟任何代码或函数的执行。是的,我理解,正如我上面所说的,ans在这方面工作正常,但导致首先执行循环外的代码。重置函数在循环执行后才被调用。这不是超时的目的吗?说真的,我不理解你的问题,因为你所描述的正是超时的目的,延迟任何代码或函数的执行是的,我理解ans正如我上面所说,它在这方面工作正常,但会导致首先执行循环外的代码。重置函数在循环执行后才会被调用。谢谢,但包括缺少的大括号没有任何区别。谢谢,但包括缺少的大括号没有任何区别。