定义变量是否比在 JS 中覆盖变量使用更多的资源

Does defining a variable use more resources than overwriting a variable in JS?

本文关键字:变量 资源 是否 JS 定义 覆盖      更新时间:2023-09-26

如果您计划使用将多次覆盖变量值的函数,那么在进行覆盖的行中使用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 1option 2会被调用30次。

[爱] 过早的优化是万恶之源。

您应该根据程序的正确确定变量的范围,而不是猜测性能或内存利用率。 虽然从学术上讲,局部变量的解析速度会比全局变量更快,但坦率地说,我会震惊地发现一个真正的程序,其中两者之间存在足够的差异,以至于人类用户注意到。 局部变量和全局变量之间的内存使用量应该几乎没有差异。 (通常,这根本没有区别,因为变量就是变量,但如果对象的多个实例,则对象的实例变量显然可以重复)

但是,人类用户注意到程序是否产生不正确的结果。 一般来说,全局变量是不好的,因为它们使程序状态更难推理。 当然,这并不是说它们永远不合适。 使用有意义的示波器,忘记性能,直到你能证明你有一个真实的、用户明显的问题

在javascript中,我们有函数级作用域和全局作用域。我们可以通过将代码包装在函数中来使变量本地化。首先,在此局部范围内搜索变量,如果在本地范围内找不到它们,则浏览器尝试在外部范围内找到它们,或者如果没有其他范围,则在全局范围内...所以很明显,如果在局部范围内找到一个变量,那么访问它的时间将比访问它(如果它存在于函数之外)花费更少的时间......

所以在我看来,如果你在函数中使用变量,那么你将有 2 个优势......

  1. 全局命名空间不会被污染。
  2. 访问当前作用域
  3. 内存在变量的时间总是比访问它们更快(如果它们在当前作用域之外声明的话)。
穆罕默德很好地

涵盖了范围问题,所以我将跟进一个测试性能的建议。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

  1. Javascript需要先在内部范围内搜索setVarible
  2. 如果不存在,请在外部范围内搜索。 当 Javascript 匹配变量时,设置给定的值。

  3. 最后,setCurrentTile方法的执行上下文中,声明的var变量被放入垃圾回收器中,然后被销毁。

如果您注意到,就速度而言,有必要在内部范围内搜索变量定义,也可以在外部范围内搜索。在系统内存方面,变量keeping alive .如果此方法被调用 30 次,则此过程将被执行,并且对于每个函数调用,将有必要在内部和外部范围内搜索,影响应用程序的速度

选项 2

变量currentTitle它是在函数的执行上下文中创建的,他的值只存在于此执行中。这种方法在速度方面保存,但会创建和破坏30倍的变量currentTitle。这意味着垃圾回收器也会被调用 30 次。我不是Javascript专家,我对垃圾收集器了解不多,但我认为有关使用更多资源的行为将取决于运行Javascript的引擎以及如何管理垃圾收集器进程。

更多信息在这里