javascript - 命名事件处理程序是否比 JavaScript 中的匿名事件处理程序消耗更多内存?

标签 javascript

我的问题是这段代码

var list = document.querySelectorAll("div");
for (let i = 0; i < list.length; i++) {
  list[i].addEventListener("event", function (event) {
    /* some code */
  });
}

消耗更多的内存
var list = document.querySelectorAll("div");
function handler(event) {
  /* some code */
}
for (let i = 0; i < list.length; i++) {
  list[i].addEventListener("event", handler);
}

这个?
如果我没记错的话,第一个代码存储列表中每个项目的事件处理程序,但第二个代码只存储一次。是真的吗?

最佳答案

视情况而定。

首先,所有的函数都有名字。在匿名函数的情况下,名称只是空字符串。所以这两种情况的区别是节省了大约 6 个字节,因为一个函数的名称是 "handler" 而另一个函数的名称是 ""

您可能想知道,在第一个版本中,是否在循环的每次迭代中都创建了一个新函数。在这种情况下,这不是必需的。

这取决于函数是否包含对i 的任何引用。如果是这样,则每次迭代都需要创建一个闭包来引用该迭代的 i 范围。将只有一个函数,但有多个闭包。

但是,如果这两个片段是等效的,handler() 不能引用 i。所以在这种情况下应该不需要多次关闭。

关于javascript - 命名事件处理程序是否比 JavaScript 中的匿名事件处理程序消耗更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62182187/

相关文章:

javascript - 使用 Javascript 的正确悬停效果

javascript - 如何在 JavaScript 中使用 FILO 检查回文?

javascript - 类型检查 React Children

javascript - 使用 Javascript 的 Chromeless 播放器中的全屏选项?

javascript - 如何使用lodash从具有特定属性的JSON获取对象?

javascript - 允许按钮数组在单击后加载音频元素?

javascript - 有人能发现问题吗?只有第一个选项适用于选择

javascript - 如何在 JavaScript 中内联组合数组?

javascript - 如何设置 Firebase 数据库规则以不允许删除或更新子项?

javascript - 将本地组件文件导入我的 LoginForm 组件时出错