for循环中的setTimeout

时间:2016-12-20 00:03:19

标签: javascript

我试图在javascript中设置for循环的延迟。我希望它记录i,有延迟,然后记录i,依此类推。我的问题是,为什么下面的代码工作,让函数返回一个函数,如下所示:

for (var i = 1; i <= 5; i++) {
        var tick = function(i) {
            return function() {
                console.log(i);
            }
        };
        setTimeout(tick(i), 500 * i);
    }

以下代码无法正常工作

for (var i = 1; i <= 5; i++) {
    var tick = function(i) {
        return console.log(i);

    };
    setTimeout(tick(i), 500 * i);
}

它一次打印出for循环中的所有值。有人可以解释为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:3)

在两段代码中,tick(i)在每个循环中立即执行

不同之处在于,在第一个示例中,tick(i)返回一个函数,该函数由setTimeout调用,并输出到控制台

在第二个示例中,立即调用console.log,返回undefined,并且一旦触发超时,setTimeout不执行任何操作,因为给定的参数不是函数(或要求的字符串)