最好在循环内部或外部声明临时变量吗?

时间:2013-11-14 19:07:27

标签: javascript

关于循环中的临时变量的最佳实践是什么?做以下事情更好:

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 个答案:

答案 0 :(得分: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
});

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


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

答案 1 :(得分:2)

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

回答你的问题:取决于具体情况。你不应该使用全局变量,但是如果第二个例子中的代码被包装在其他函数中,那么它更可取,因为变量只被分配一次(顺便说一下,数字2说明了闭包的概念,如果包含在父内部中功能)。

答案 2 :(得分:1)

没有好的做法,这取决于你想要达到的范围。

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

答案 3 :(得分:0)

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

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

和此:

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

因为第二个回调提供了范围。如果你正在使用for循环,那么如果你在函数内部或外部声明变量就没那么重要,因为无论如何变量都会从循环中移出{。}}。

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