在JavaScript循环外声明变量可以获得速度和内存吗?

C#有类似的问题,但我们没有看到任何JavaScript。

在循环中声明变量是否被接受?

假设循环为200次迭代。

在样品1上使用样品2是否存在性能要求(记忆和速度)? 我们正在使用jQuery循环。 它提高了我们将var保留在循环中的代码可读性,但是如果它不是最佳实践或者会导致性能大幅下降或内存使用率增加,我们将进行切换。

**Sample 1:** $(this).each( function() { var i = $(some_div).clone(); *** edit i *** $(another_div).append( i ); }); **Sample 2:** var i = null; *** edit i *** $(this).each( function() { i = $(some_div).clone(); $(another_div).append( i ); }); 

样本1(内部变量)更快: http : //jsperf.com/variable-outside-faster

但差异不值得关注。

这是一个微优化,停止这样做。

而是投入精力编写可读代码,编写文档并测试代码。

但是,有一些值得优化的高级问题:

  • 删除像jQuery这样的膨胀抽象,使你的速度降低一个数量级。
  • 减少在屏幕上执行的渲染和绘图量
  • 降低算法的大O复杂度
  • 减少服务器 – 客户端出行的延迟。

这将取决于实施,但原则上我认为性能不会有任何明显的差异。 由于您使用的是jQuery循环,因此i变量将在第一种情况下位于函数作用域中,而在第二种情况下位于外部作用域中。 这可能会对内存分配产生稍微不同的影响,但我怀疑它会引起注意。 唯一的方法是确保它选择一个实现并尝试衡量其中的性能。

这些是潜在的语义不同所以这是一个苹果到橙子的比较:例如,如果你在ajax回调中使用i而不是同步你几乎肯定会使用我的最后一次赋值i ,而不是每个不同的值,如果你做这种变化。

纯粹的猜测如下:

因此,我们知道如果你正在使用var inside form的全部潜力,那么每个i需要不同的内存地址,那么它必须做更多的工作。

需要进行重要分析才能确定$.each是否同步使用它的回调参数。 因此, 如果这是一个有效的优化,我怀疑大多数JS编译器将无法实现它,并且手动制作应该给你(恒定时间)速度和内存改进。

其他考虑:

更多词汇范围可能意味着线性增加查找变量的成本。