关于循环中的临时变量的最佳实践是什么?做以下事情更好:
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
});
我一直认为性能没有差别,但每次使用时我都不确定我是否遵循良好做法......
答案 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循环,那么如果你在函数内部或外部声明变量就没那么重要,因为无论如何变量都会从循环中移出{。}}。
如果您特别询问,是否在函数内部或外部声明变量很重要,因为函数提供了范围,并且变量不会被提升。如果你关心性能,你应该在回调之外声明它,因为变量只会被创建一次。但是,如果您不需要在回调之外使用变量,我实际上建议在回调中定义变量。在我看来,它使代码更容易阅读,除非你的临时对象内存非常昂贵,否则它不会以任何明显的方式影响性能。