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

在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”); for(设i=0;i

我的问题是这是代码吗

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”);
for(设i=0;i
消耗的内存比

var list = document.querySelectorAll("div");
function handler(event) {
  /* some code */
}
for (let i = 0; i < list.length; i++) {
  list[i].addEventListener("event", handler);
}
var list=document.querySelectorAll(“div”);
函数处理程序(事件){
/*一些代码*/
}
for(设i=0;i
这个?
如果我没弄错的话,第一个代码存储列表中每个项目的事件处理程序,而第二个代码只存储一次。这是真的吗?这要看情况而定

首先,所有函数都有名称。对于匿名函数,名称只是空字符串。因此,这两种情况之间的区别是节省了大约6个字节,因为一个函数的名称是
“handler”
,而另一个函数的名称是

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

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

但是,如果这两个代码段是等效的,
handler()
不能引用
i
。因此,在这种情况下,应该不需要多个闭包。

tldr/face-value:no。不再回答:显示的代码有两种语义不同的情况。影响内存的是函数对象的数量(每个实例的小开销、闭包绑定和实现共享细节),而不是它们是否有“名称”。