新的局部变量在大的FOR循环,这是一个问题
New Local variable inside large FOR loops, is this a issue?
在这个简单的示例函数中:
doSomething = function(withThisId) {
var videos = getVideos(), // array of videos
discovered = false
;
for(var i = 0; i < 50000; i++) {
var keepToCheck = videos[i];
if(keepToCheck.id == withThisId) {
discovered = true;
break;
}
}
return discovered;
};
我想知道是否:
在
for
循环中,我们在每次迭代时初始化一个名为keepToCheck
的新变量,然后将其用于某些内容。这是否意味着每次都会创建一个新变量,因此我们可能有50,000个keepToCheck
变量存在于内存中(直到GC清除它)?或者JS引擎足够聪明,知道变量可以被重用,而不是创建重复?
如果我们在
for
循环之外初始化var keepToCheck
,然后将其设置为keepToCheck = videos[i];
,是否有性能优势?
我一直在努力研究这个问题,但在网上找不到任何建议。
在JavaScript中,只会创建一个变量。在第一次迭代之后,keepToCheck
已经存在,并且将被覆盖,而不是重新创建。
然而,出于组织目的,我更愿意在知道需要时列出所有变量。在本例中,我将输入:
var videos = getVideos(),
discovered = false,
keepToCheck, i;
后面跟着其余的代码。如果某些变量仅在if
中使用,则在该块中首先对它们进行var
。
变量被"提升"到声明它们的函数的顶部,如果被覆盖,则被垃圾收集(完全由VM/浏览器调度)。重复的var语句(例如,在循环中)只是浪费。虽然内存中不会有50k变量,但它会浪费处理时间和一些内存,具体取决于垃圾收集何时运行。这就是为什么最好在函数的顶部声明变量的原因。试着在这段代码上运行JSLint/JShint,看看我的意思。
不太了解JS,但在其他有垃圾收集的语言中,局部变量不受垃圾收集的影响——它们存在于堆栈中,所以在作用域离开后它们就消失了。因此,不能同时存在一个以上的这些变量。但是,您可能会在每次迭代中使用不同的地址。
相关文章:
- 火狐中的多个问题,但在 chrome 中工作正常,没有一个问题
- 是否从超时内开始间隔是一个问题
- java脚本我需要帮助来解决一个问题
- Dreaded 100%边栏高度-jQuery修复,但另一个问题出现了
- I'我在用JavaScript进行验证时遇到了一个问题
- Jstree-Can't在AJAX调用中选中复选框,适用于经典调用.一个问题
- 我在角度指令和角度路由中有一个问题
- 我有一个问题,使用 Javascript 或 Jquery 创建具有字符串计数的动态字段
- 如何在测验应用中移动到下一个或上一个问题
- 如何创建按钮转到测验软件中的下一个问题
- 我对用php代码创建的HTML有一个问题
- 我想使用fbi . event .subscribe记录跟踪值在Facebook喜欢按钮,但遇到了一个问题
- 如果效率是一个问题,如何修改JavaScript修剪函数?
- 一个问题与大量的图像-广告画廊插件
- 新的局部变量在大的FOR循环,这是一个问题
- 我在放大分形(webgl)时遇到了一个问题
- jQuery对话框的一个问题
- 在javascript中,通过一个对象数组为每个对象发出一个问题
- 浏览器渲染网页的顺序是什么,为什么脚本阻塞是一个问题
- 闭包编译器外部解决了一个问题,但我不明白为什么