2 回答
TA贡献2036条经验 获得超8个赞
问题是您正在覆盖并且您正在尝试修改传入的x
数字。j
首先,forEach 的定义有助于阅读。
具体来说,在您传入的函数中,showCircle
是item
数组的当前项,j
是循环的当前索引,x
是原始数组,在本例中为initArray
。然后,您用 覆盖x
,let x = 0
并尝试递增j
,这不会执行任何操作,因为它在使用后会递增。
我认为您正在寻找更像这样的东西:
// Declare these outside the loop
var x = 0;
var colors = ['blue','pink','green'];
function showCircle(num, j) {
// Save the current value so it isn't overwritten by the loop/setTimeout combination
let y = x;
// Increment x
x++;
setTimeout(function () {
// Get the color, using the modulus operator (%) to start at the beginning again
var color = colors[y % colors.length];
// Get the element. num is the current item in the loop from initArray
var element = document.getElementById(num);
// Make it glow!
element.classList.add(`cell-glow-${color}`)
setTimeout(function () {
// Make it not glow...
element.classList.remove(`cell-glow-${color}`)
}, 400);
console.log(color);
// j is the index of num in initArray
}, speed() * j);
};
function showEachCircle(captureUserClicks) {
initArray.forEach(showCircle);
}
如果您不熟悉模数(或余数)运算 %符,那么当您想要循环的内容有限时(在本例中),它对于循环非常有用colors。在此示例中,有 3 种颜色:
0 % colors.length = 0
1 % colors.length = 1
2 % colors.length = 2
3 % colors.length = 0
4 % colors.length = 1
etc..
TA贡献1821条经验 获得超6个赞
我就是这样做的:
为了避免
x=0
每次调用函数时都被执行,我们将把它放在函数之外。为了迭代颜色数组,我们将利用模运算符:
`x = (x+1)%3`
这将一次又一次地
x++
获取值。0, 1, 2
array.forEach()
将多次调用该函数,而无需等待完整的闪烁(从白色到红色,再回到白色)完成。我们将使用递归来代替。完整的闪存完成后,如果需要,我们将再次调用该函数。
您可以在代码片段中看到一个工作示例:
const initArray = [1,1,1,1,1,1];
const colors = ['red', 'green', 'blue'];
let x = 0;
let numberOfFlashes = 0;
function showCircle() {
setTimeout(()=> {
color = colors[x];
console.log(color);
setTimeout(()=> {
console.log('white');
numberOfFlashes++;
if(numberOfFlashes<initArray.length){
showCircle();
}
}, 400);
x = (x+1)%3;
}, 400);
}
showCircle();
现在你可以把你的代码代替我的控制台日志,你应该让它工作
添加回答
举报