为什么我不应该在Javascript循环中创建函数?

时间:2014-04-01 23:57:52

标签: javascript function loops

前几天我用JSFiddle检查了my script并在其中一行上发出警告:Don't make functions within a loop


for (x = 0; x < 10; x++) {

    if (moment(now) > moment(then)) {

        doIt(x); // do it now

    } else {

        timeTillEnd = moment(then) - moment(now);

        setTimeout(function () {

            doIt(x); // do it later

        }, timeTillEnd); // <-- flagged here

    }
}

为什么我不应该在Javascript循环中创建函数?

另外:在这里显示的特定情况下使用函数是否有问题?

2 个答案:

答案 0 :(得分:3)

您尝试做的可能是错误的,x变量可能不是您所期望的。请参阅以下链接:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake

创建它们也相对昂贵。

每个函数都附带了它使用的变量的闭包,如果你正在进行“正常的命令式编程”,并且只是想通过定义子任务的内部函数来使代码看起来更清晰,那么这是一个不必要的开销:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Performance_considerations

在你的情况下,你似乎确实需要一个带闭包的函数,因为你推迟了一些计算,但要确保你做了正确的值捕获。

答案 1 :(得分:0)

因为它可能导致意外的闭包行为(捕获的变量将在循环的最后一次迭代中分配值)。您还将获得每个循环的新函数实例,这会浪费资源。

现代浏览器为setTimeout采用第三个参数,该参数是函数的参数。见here。这也解决了闭包问题。