4

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

4 回答 4

4

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

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

于 2012-04-04T23:58:50.517 回答
4

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

而是将精力投入到编写可读代码以及为代码编写文档和测试上。

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

  • 删除像 jQuery 这样让你慢一个数量级的臃肿抽象。
  • 减少您在屏幕上进行的渲染和绘图量
  • 降低算法的大 O 复杂度
  • 减少服务器-客户端行程的延迟。
于 2012-04-05T00:24:07.487 回答
0

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

于 2012-04-04T23:58:56.390 回答
0

这些在语义上可能不同,因此这是一个苹果与橘子的比较:例如,如果您使用的是i内部 ajax 回调而不是同步,那么您几乎肯定会i多次使用最后一次赋值,而不是使用每个不同的值(如果您进行了此更改) .

纯猜测如下:

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

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

其他注意事项:

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

于 2012-04-05T00:07:36.810 回答