定义变量是否比在 JS 中覆盖变量使用更多的资源
Does defining a variable use more resources than overwriting a variable in JS?
如果您计划使用将多次覆盖变量值的函数,那么在进行覆盖的行中使用var
对性能是否不利?
例如
选项 1
var currentTile;
function setCurrentTile(index) {
currentTile = $scope.tiles[index];
}
选项 2
function setCurrentTile(index) {
var currentTile = $scope.tiles[index];
}
从历史上看,我一直在使用选项 #1,因为减少代码中var
的数量似乎很直观。但也许这没有区别,使用不那么冗长的方法更理想。
谁能建议?
上下文更新
我们生成一个长数组,如下所示,
function prepGame() {
// GENERATE TILE PATTERN
var tiles = [];
var times = 30;
for ( var i = 0; i < times; i++ ) {
tiles.push(Math.floor(Math.random() * 9));
}
$scope.tiles = tiles;
}
然后遍历它,将值传递给 setCurrentTile(index)
.所以option 1
或option 2
会被调用30次。
[爱] 过早的优化是万恶之源。
您应该根据程序的正确性确定变量的范围,而不是猜测性能或内存利用率。 虽然从学术上讲,局部变量的解析速度会比全局变量更快,但坦率地说,我会震惊地发现一个真正的程序,其中两者之间存在足够的差异,以至于人类用户注意到。 局部变量和全局变量之间的内存使用量应该几乎没有差异。 (通常,这根本没有区别,因为变量就是变量,但如果对象的多个实例,则对象的实例变量显然可以重复)
但是,人类用户会注意到程序是否产生不正确的结果。 一般来说,全局变量是不好的,因为它们使程序状态更难推理。 当然,这并不是说它们永远不合适。 使用有意义的示波器,忘记性能,直到你能证明你有一个真实的、用户明显的问题。
在javascript中,我们有函数级作用域和全局作用域。我们可以通过将代码包装在函数中来使变量本地化。首先,在此局部范围内搜索变量,如果在本地范围内找不到它们,则浏览器尝试在外部范围内找到它们,或者如果没有其他范围,则在全局范围内...所以很明显,如果在局部范围内找到一个变量,那么访问它的时间将比访问它(如果它存在于函数之外)花费更少的时间......
所以在我看来,如果你在函数中使用变量,那么你将有 2 个优势......
- 全局命名空间不会被污染。 访问当前作用域
- 内存在变量的时间总是比访问它们更快(如果它们在当前作用域之外声明的话)。
涵盖了范围问题,所以我将跟进一个测试性能的建议。JS在控制台命名空间中有一个允许性能测试的方法。 它是非标准的,因此只应在测试中使用。 它可能看起来像这样:
var currentTile;
console.time("currentTile");
function setCurrentTile(index) {
currentTile = $scope.tiles[index];
}
console.time("currentTile");
为了进一步提高性能,您可以设置如下循环长度变量:
for(var i =0, times = 30; i < times; i++) {
}
在选项 1 中
- Javascript需要先在内部范围内搜索
setVarible
。 -
如果不存在,请在外部范围内搜索。 当 Javascript 匹配变量时,设置给定的值。
-
最后,
setCurrentTile
方法的执行上下文中,声明的var
变量被放入垃圾回收器中,然后被销毁。
如果您注意到,就速度而言,有必要在内部范围内搜索变量定义,也可以在外部范围内搜索。在系统内存方面,变量keeping alive
.如果此方法被调用 30 次,则此过程将被执行,并且对于每个函数调用,将有必要在内部和外部范围内搜索,影响应用程序的速度
在选项 2 中
变量currentTitle
它是在函数的执行上下文中创建的,他的值只存在于此执行中。这种方法在速度方面保存,但会创建和破坏30倍的变量currentTitle
。这意味着垃圾回收器也会被调用 30 次。我不是Javascript专家,我对垃圾收集器了解不多,但我认为有关使用更多资源的行为将取决于运行Javascript的引擎以及如何管理垃圾收集器进程。
更多信息在这里
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 值对象在某个变量发生更改后发生更改
- Javascript变量赋值|
- AngularJS-在JSON选择器中使用变量名
- Javascript计数器变量未显示正确的值
- delete关键字在全局变量上的不同行为
- 定义变量是否比在 JS 中覆盖变量使用更多的资源
- js警报框中的资源文件变量给出字符串ASCII代码问题
- AngularJS:资源没有发送带有未定义变量的参数
- 将url中的变量传递给AngularJS中的资源回调函数
- 将本地资源变量域/协议传递到Express中查看