Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 最好在循环内部还是外部声明临时变量?_Javascript - Fatal编程技术网

Javascript 最好在循环内部还是外部声明临时变量?

Javascript 最好在循环内部还是外部声明临时变量?,javascript,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 }); 我一直认为性能没有差异

关于循环中的临时变量,性能方面的最佳实践是什么?这样做是否更好:

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

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

没有良好的实践,这完全取决于您尝试实现的范围


在循环内部意味着您的var将无法在循环外部访问。与闭包相关的还有其他一些事情。例如,一个取决于我们谈论的是什么样的表现。在任何情况下,我怀疑其中任何一个都会显示出明显的不同。还请记住,引擎可能会应用优化,而生成的结果实际上可能会有所不同


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


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



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

前两条注释非常错误(在撰写本文时,一些注释已被删除)。因为forEach将函数作为参数,所以会形成闭包,变量不适用


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

这实际上是一个有趣的问题,主要是因为javascript处理作用域的方式。有几条评论提到,这个问题以前已经得到了回答,但我觉得没有。请注意,这两者之间有很大区别:

for(var i = 0; i < someArray.length; i++){}
因为第二个回调中的回调提供了作用域。如果您使用的是for循环,那么无论您是在函数内部还是外部声明变量,实际上都无关紧要,因为变量无论如何都会在循环之外


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

@user2356705这个问题代表了一种完全不同的情况。IMO,请尽可能将变量保持在最接近的范围内,因此在这种情况下,在回调中。为什么“由于变量只初始化一次”首选“只初始化一次”--您的意思是“只分配一次”吗"? 每次评估作业时都会设置它。@Ted Hopp你完全正确-我太马虎了。在我的回答中更正了。如果对象有一些实际的内容/大小非常大,那么每次都必须对其进行初始化,但因为它是空的,所以只能分配给它。@BlueSkies计算机必须在寄存器中为每个对象留出一些内存。次数越少越好老实说,用克罗克福德的话说,一切都“迷失在噪音中”。我的答案只有在对象相当大的情况下才适用。“除非临时对象的内存非常昂贵,否则它不会以任何明显的方式影响性能”。从示例中可以看出,无论变量定义在何处,对象实际上都是在循环中创建的。你是说把一个大对象赋给一个局部变量比把它赋给一个范围更大的变量性能差吗?@FelixKling-这是一个我完全忽略的非常好的观点。在类似于OP POST的情况下,仍然没有任何区别,因为分配总是在循环中发生。我的意思是在调用forEach之前分配对象,然后在回调中使用它。提高代码性能的唯一方法是,如果temp对象内存昂贵,并且只定义一次。
var temp_obj;
json.forEach(function(item) {
  temp_obj = {};
  // do some operations with temp_obj
});
for(var i = 0; i < someArray.length; i++){}
someArray.forEach(function(item){});