JavaScript:Last setInterval比预期的持续时间更长

JavaScript:Last setInterval比预期的持续时间更长,javascript,Javascript,以前我曾就如何修复javascript代码寻求过帮助,现在我已经修复了,但是我的代码有问题吗?因为最后一个阵列保持打开的时间超过1秒,所以它保持打开的时间大约为5秒。这是因为我正在重置数组,还是在Javascript中这很正常 function Background() { var Backgrounds = [ '#333', '#777', '#999', '#CCC' ], Max_Backgrounds = Backgrounds.length,

以前我曾就如何修复javascript代码寻求过帮助,现在我已经修复了,但是我的代码有问题吗?因为最后一个阵列保持打开的时间超过1秒,所以它保持打开的时间大约为5秒。这是因为我正在重置数组,还是在Javascript中这很正常

function Background()
{
    var Backgrounds = [
        '#333', '#777', '#999', '#CCC'
    ],
    Max_Backgrounds = Backgrounds.length, 
    Background_Stage = -1;// Yes, it's meant to be -1 so when background_stage++; is called it will make it 0 thus start at the beginning of the array.
    setInterval(function() { 
        if(Background_Stage >= Max_Backgrounds) Background_Stage = -1;
            $('body').css('background', Backgrounds[Background_Stage++]); 
    }, 1000);
}

正如在评论中指出的,您没有在上一次迭代中更改背景,这就是为什么它比其他迭代逗留的时间更长,这应该保持它的一致性

工作示例:


我建议不要进行-1初始化,而是使用模块。i、 e.
3%2==1
产生除法的剩余部分

另外,setInterval会漂移,因此我宁愿使用setTimeout,并在1秒后再次执行:

相当于

$('body').css('background', Backgrounds[Background_Stage]);
Background_Stage = Background_Stage + 1;
每次循环时,背景都被设置为未定义。如果您希望在访问变量之前使用变量增量,则需要使用

$('body').css('background', Backgrounds[++Background_Stage]);
完整示例(如果条件也已修改):


为什么将
Background\u Stage
设置为-1而不是0?另外:您可以重置它,而不是切换背景。旁注:Javascript不是Java。@Joachim Sauer我将它设置为-1,因为0是起始数组号,而背景是++;将其设置为0,而将其设置为1。@Ingo Bürk我知道这是一个输入错误。我添加了更新的代码,但仍然持续5秒以上。而且
Background\u Stage>Max\u Backgrounds
检查有缺陷,当出现这种情况时已经太晚了。
Backgrounds[Background\u Stage++]如果您初始化为
0
,则
是正确的,而不是更混乱的
-1
,如
中的(var i=0;i
我同意,但我认为是操作顺序在@Callum中出错。我想解释一下他为什么会有问题,而不仅仅是重构代码。好的,我同意,我在上一次编辑中想,我只是把它重构成更地道的东西
(function () {
    var Backgrounds = [
        '#333', '#777', '#999', '#CCC'
    ],
    Max_Backgrounds = Backgrounds.length, 
    Background_Stage = 0,
    changeBackground = function () {
        $('body').css('background', Backgrounds[Background_Stage]); 
        Background_Stage = (Background_Stage + 1) % Max_Backgrounds;
        setTimeout(changeBackground, 1000);
    };
    changeBackground();
}());
$('body').css('background', Backgrounds[Background_Stage++]);
$('body').css('background', Backgrounds[Background_Stage]);
Background_Stage = Background_Stage + 1;
$('body').css('background', Backgrounds[++Background_Stage]);
function Background()
{
    var Backgrounds = [
        '#333', '#777', '#999', '#CCC'
    ],
    Max_Backgrounds = Backgrounds.length, 
    Background_Stage = -1;// Yes, it's meant to be -1 so when background_stage++; is called it will make it 0 thus start at the beginning of the array.
    setInterval(function() { 
        if(Background_Stage >= Max_Backgrounds - 1) Background_Stage = -1;
            $('body').css('background', Backgrounds[++Background_Stage]); 
    }, 1000);
}