3

关于循环中的临时变量,性能方面的最佳实践是什么?做类似的事情会更好:

some_array.forEach(function(item) {
  var temp_obj = {};
  // do some operations with temp_obj
});

或者

var temp_obj;
json.forEach(function(item) {
  temp_obj = {};
  // do some operations with temp_obj
});

我一直认为性能没有差异,但每次我使用它时,我都不确定我是否遵循了良好的做法......

4

4 回答 4

2

取决于我们在谈论什么样的表现。无论如何,我怀疑其中任何一个都会显示出明显的差异。还要记住,引擎可能会应用优化,而生成的实际上可能会有所不同。


some_array.forEach(function(item) {
  var temp_obj = {};
  // do some operations with temp_obj
});

在这种情况下,变量temp_obj的查找速度会更快,因为它是在本地范围内定义的。这可能是更可取的。


var temp_obj;
json.forEach(function(item) {
  temp_obj = {};
  // do some operations with temp_obj
});

函数的创建时间可能会更短,因为不必创建局部变量。


当然,局部变量和自由变量之间也存在行为差异。自由变量将在每个函数调用之间“共享”。

于 2013-11-14T19:12:07.430 回答
2

前两条评论非常错误(在撰写本文时,其中一些已被删除)。由于 forEach 将函数作为参数,因此形成了一个闭包并且变量提升不适用。

回答您的问题:取决于上下文。您不应该使用全局变量,但如果您的第二个示例中的代码包含在其他函数中,则更可取,因为该变量仅分配一次(顺便说一下,如果包含在父函数中,数字 2 很好地说明了闭包的概念功能)。

于 2013-11-14T19:12:10.260 回答
1

没有好的做法,这完全取决于您要达到的范围。

循环内部意味着您的 var 将无法在循环外部访问。还有一些与关闭有关的其他事情。例如一种资源

于 2013-11-14T19:11:56.423 回答
0

这实际上是一个有趣的问题,主要是因为 javascript 处理范围的方式。有几条评论提到这个问题之前已经回答过,但在我看来它并没有。请注意,这之间有很大的不同:

for(var i = 0; i < someArray.length; i++){}

和这个:

someArray.forEach(function(item){});

因为第二个回调提供了范围。如果您使用的是 for 循环,那么在函数内部或外部声明变量实际上并不重要,因为无论如何该变量都会被提升到循环之外。

在您特别询问的情况下,是否在函数内部或外部声明变量很重要,因为函数提供范围,并且变量不会被提升。如果你关心性能,你应该在回调之外声明它,因为变量只会被创建一次。但是,如果您不需要在回调之外使用变量,我实际上建议在回调中定义变量。在我看来,它使代码更易于阅读,除非您的临时对象的内存非常昂贵,否则它不会以任何明显的方式影响性能。

于 2013-11-14T19:28:47.240 回答