在for循环中使用setTimeout失败
failing to use setTimeout in a for-loop
我一直在尝试创建一个JavaScript函数,它可以快速循环所有24位的rgb值,并以动态变化的div背景的形式显示它们
为了让这个过程慢到可以看到一些东西,我想使用setTimeout方法。我做了一些关于在循环中使用setTimeout的研究,发现了这一点。
循环中的setTimeout不打印连续值
似乎完美地描述了我的问题。我试着使用那里给出的解决方案。但由于某种原因,它不起作用。
编辑:它现在工作(它使用setInterval,因为这可能在这里更有意义)
<script>
function setColor(i) {
var c = i.toString(16);
switch(c.length) {
case 1:
c = "00000" + c;
break;
case 2:
c = "0000" + c;
break;
case 3:
c = "000" + c;
break;
case 4:
c = "00" + c;
break;
case 5:
c = "0" + c;
break;
default:
c;
}
document.getElementById("colorContainer").style.background = "#" + c;
}
function loopThroughColors() {
var i = 0x000000;
setInterval(function(intervalId) {
setColor(i);
i += 1;
if (i >= 0xffffff) {
clearInterval(intervalId);
}
}, 100);
}
</script>
我会采取不同的方法,使用setInterval而不是setTimeout,类似于:
function setColor(i) {
var c = i.toString(16);
document.getElementById("colorContainer").style.background = "#" + c;
}
var i = 0x100;
setInterval(function(intervalId) {
setColor(i);
i += 1;
if (i >= 0xfff) {
clearInterval(intervalId);
}
}, 100);
#colorContainer {
width: 100px;
height: 100px;
}
<div id="colorContainer"></div>
请注意,setColor中有一个错误-它没有在字符串前面加0,所以#100000之前的所有颜色都无法正常工作。我作弊了,只通过#100和#fff之间的颜色来显示setInterval可以工作。
您的问题是无法在对setTimeout的调用中传递参数。
试试这个:
function loopThroughColors() {
for (var i = 0x000000; i <= 0xffffff; i++) {
setTimeout(function() {
setColor(i);
}, i);
}
}
通过这种方式,您给了一个没有参数的匿名函数setTimeout,但该函数恰好有您想要的参数。
正如Bergi所说,当您试图将参数i
传递给setColor
时,实际上只是在评估语句setColor(i)
。相反,您需要给出函数的名称本身。
相关文章:
- setInteval vs setTimeout
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- setTimeout可以与闭包内的函数一起使用吗
- Javascript setTimeout for an array
- 刷新后,setTimeout将工作或不工作
- 继续使用javascript中的setTimeout
- setTimeout函数能否在其前面的代码执行之前激发
- jQuery setTimeOut: in for-loop
- SetTimeout and clearTimeout in Javascript
- 在setTimeout中调用相同的函数
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在for循环中使用setTimeout失败
- 从setTimeout调用window.event时失败
- 函数内的setTimeout失败
- jQuery animate()在setTimeout()循环后失败
- setTimeout在第一次迭代后失败