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

时间:2012-04-04 23:51:16

标签: javascript jquery

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 );
});

4 个答案:

答案 0 :(得分:3)

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

但这种差异并不值得关注。

答案 1 :(得分:3)

这是微观优化,停止这样做。

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

纯粹推测如下:

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

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

其他注意事项:

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