前几天我用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循环中创建函数?
另外:在这里显示的特定情况下使用函数是否有问题?
答案 0 :(得分:3)
您尝试做的可能是错误的,x
变量可能不是您所期望的。请参阅以下链接:
创建它们也相对昂贵。
每个函数都附带了它使用的变量的闭包,如果你正在进行“正常的命令式编程”,并且只是想通过定义子任务的内部函数来使代码看起来更清晰,那么这是一个不必要的开销:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Performance_considerations
在你的情况下,你似乎确实需要一个带闭包的函数,因为你推迟了一些计算,但要确保你做了正确的值捕获。
答案 1 :(得分:0)
因为它可能导致意外的闭包行为(捕获的变量将在循环的最后一次迭代中分配值)。您还将获得每个循环的新函数实例,这会浪费资源。
现代浏览器为setTimeout采用第三个参数,该参数是函数的参数。见here。这也解决了闭包问题。