首页  >  文章  >  web前端  >  ## 如何在事件监听器中保留变量值:按值传递还是按引用传递?

## 如何在事件监听器中保留变量值:按值传递还是按引用传递?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 03:27:29511浏览

## How to Preserve Variable Values in Event Listeners: Pass by Value or by Reference?

在事件监听器中保留变量值:按值传递与按引用传递

在循环内分配变量并添加事件监听器时,重要的是要考虑是否要将变量的值或引用传递给侦听器。

在您的情况下,您遇到了一个问题,即每个侦听器都使用 i 的最终值而不是当时的预期值侦听器创建。出现此问题的原因是 JavaScript 使用 var 关键字进行变量提升,其中变量在其作用域的顶部声明,从而赋予它们全局作用域(即使在块内声明)。

要解决此问题,您可以使用两种技术:

将块作用域与 let 或 const 结合使用:

在现代浏览器中,您可以使用 let 或 const 关键字来创建块作用域变量。这确保变量在其包含块内声明,并且不能在其外部访问。

for (let i = 0; i < results.length; i++) {
  let marker = results[i];
  google.maps.event.addListener(marker, 'click', () => change_selection(i));
}

使用匿名函数创建闭包:

在旧版浏览器中不支持块范围变量,您可以创建一个闭包来保留每次迭代的 i 的当前值。这涉及到将事件侦听器创建包装在匿名函数内并将 i 作为参数传递:

for (var i = 0; i < results.length; i++) {
  (function (i) {
    marker = results[i];
    google.maps.event.addListener(marker, 'click', function() {
      change_selection(i);
    });
  })(i);
}

通过将 i 作为第一个参数传递到匿名函数中,您可以有效地将 i 的值传递给函数调用监听器的时间。

以上是## 如何在事件监听器中保留变量值:按值传递还是按引用传递?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn