Javascript:在循环内调用函数=意外结果

时间:2014-07-23 14:52:33

标签: javascript jquery arrays function loops

我试图循环尝试在javascript(jQuery)中循环遍历数组,并将每个键传递给单独的函数。

这种方法很好,除非我想在防洪功能调用之间考虑半秒延迟。当我这样做时,它会按预期停止运行,并且只将最后一个键传递给函数而不是当前函数?

请参阅我的简化示例:

$( document ).ready(function() {
    var arr = ['1','2','3','4','5','6','7','8','9'];
    var delay = 500;
    for (var i = 0; i < arr.length; i++) {
        key = arr[i];
        delay = 500 + delay;
        setTimeout(function(){
            output( key );
        }, delay );
    }
});

function output( val ) {
    $('#results').append( val );
}

预期

123456789

生产

999999999

陌生人仍然......

我认为这是因为每个循环都覆盖了'key'值,所以当Timeout函数触发时,'key'总是设置为'9'。所以我试着不要覆盖'key',而是每次使用一个数组并设置一个新的'key',如下所示:

$( document ).ready(function() {
    var arr = ['1','2','3','4','5','6','7','8','9'];
    var delay = 0;
    var key = [];
    for (var i = 0; i < arr.length; i++) {
        delay++;
        key[delay] = arr[i];
        setTimeout(function(){
            output( key[delay] );
        }, 500*delay );
    }
});

function output( val ) {
    $('#results').append( val );
}

这仍然会产生结果:

999999999

所以:

  • 为什么每次'延迟'递增并且设置超时功能时'key [delay]'应该是不同的值时会发生这种情况?

  • 我怎样才能达到我想要的结果,每次触发Timeout功能时键都不同?

0 个答案:

没有答案