首页 > 解决方案 > 在带有匿名函数的循环中运行这个 addEventListener 会创建 30 个单独的函数对象吗?

问题描述

问题 1a:您好,我想知道运行以下代码的版本 1 是否会导致创建多个匿名函数(在 addEventListener 部分),为可点击节点列表的每个元素创建一个?

问题 1b:在版本 2 中,我只是向 addEventListener 传递了对另一个函数的引用。版本 2 与版本 1 相比有什么好处吗?

我的两个问题都是相关的。我不确定 addEventListener 是否在不同元素之间共享匿名函数。请尽可能详细。我将不胜感激。先感谢您。:)

额外信息:我预计可点击节点列表的长度在 28 到 31(日历)之间。

版本 1:

Base.prototype.addCalendarClickEffect = function () {
    let clickable_node_list = this.clickable_node_list
    let lastElementClicked = null;

        for(let i = 0; i< clickable_node_list.length; i++){
          clickable_node_list[i].addEventListener("click", function (event) {
              if(lastElementClicked){
                lastElementClicked.classList.remove("clicked");
              }
              event.target.classList.add("clicked");
              lastElementClicked = event.target;
          });
        }
}

版本 2:

Base.prototype.addCalendarClickEffect = function () {
    let clickable_node_list = this.clickable_node_list

        for(let i = 0; i< clickable_node_list.length; i++){
          clickable_node_list[i].addEventListener("click", toggleClickedClass);
        }
}

function toggleClickedClass(event) {
  if(lastElementClicked){
    lastElementClicked.classList.remove("clicked");
  }
  event.target.classList.add("clicked");
  lastElementClicked = event.target;
}

标签: javascriptaddeventlisteneranonymous-functionnodelist

解决方案


推荐阅读