在事件监听器中保留变量值:按值传递与按引用传递
在循环内分配变量并添加事件监听器时,重要的是要考虑是否要将变量的值或引用传递给侦听器。
在您的情况下,您遇到了一个问题,即每个侦听器都使用 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中文网其他相关文章!