我正在尝试以下操作:

var timeout = 300;
var colors = ['aqua', 'limegreen']
for (var i=0; i < 4; ++i) {
    console.log(colors[i % colors.length]);
    setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout);
}

function changeColor(color) {
    console.log(color);
}

这不起作用,因为 changeColor 的参数在执行时已解析……这意味着颜色将始终相同。在我的 chrome 中,它也无法在超时后传递参数:
var color = colors[i % colors.length];
setTimeout(function() { changeColor() }, i * timeout, color);

好吧,我现在有一个有效的时间间隔的解决方法......但是因为我在这里学习......这是如何通过超时完成的?

最佳答案

调用 changeColor 的匿名函数将在 for 循环结束时执行。所以它将等于它获得的最后一个值。通过使用匿名函数包装对 setTimeout 的调用来防止这种捕获您在闭包中需要的值:

for (var i=0; i < 4; ++i) {
    console.log(colors[i % colors.length]);
    (function(i){
        setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout);
    })(i);
}

关于javascript - 带有在运行时更改的参数的超时函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7350561/

10-13 00:32