Javascript 首先执行循环外的代码
我有12个彩色方块,当点击按钮时,随机选择6个,背景颜色变为黑色 在我添加setTimeout函数之前,这些方块都是同时改变颜色的。setTimeout函数修复了这个问题,但导致了另一个问题——循环外的代码在循环之前执行,即调用重置函数和警报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
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正如我上面所说,它在这方面工作正常,但会导致首先执行循环外的代码。重置函数在循环执行后才会被调用。谢谢,但包括缺少的大括号没有任何区别。谢谢,但包括缺少的大括号没有任何区别。