javascript - 在添加事件时捕获变量值
问题描述
我正在用 javascript 创建一个图像轮播,在添加事件侦听器时遇到问题,具有图像指示器的基本代码是这样的:
Array.from(mCOMPLEX_ImgTags).forEach(
function(eachImageTag){
// mCOMPLEX_ImgPaths.push(eachImageTag.getAttribute("src"));
carouselIndicator = new COMPLEX_Img(carouselIndicatorProps, true);
carouselIndicator = carouselIndicator.make();
carouselIndicator.addEventListener("mouseenter", enterEvent=>{
CssHelper.assignStyleProp(carouselIndicator,{"background":"#ffa500"} );
});
carouselIndicator.addEventListener("mouseleave", enterEvent=>{
CssHelper.assignStyleProp(carouselIndicator,{"background":"#ff0000"});
});
mCOMPLEX_Container.appendChild(carouselIndicator);
});
现在指标很好并且放置得很好,但是,问题是该变量carouselIndicator
似乎是对一个对象的引用,并且该引用在 javascript 中循环时发生了更改(即,在添加侦听器时未捕获引用的值,我希望)。结果,当我将鼠标悬停在 5 个指标中的任何一个上时,只有最后一个会突出显示。
如何保存应该保存的参考?即各个指标是否保存了它们的参考?
解决方案
看起来它carouselIndicator
是在循环中的闭包范围之外声明的forEach()
,因此它只会引用内存中的单个位置。因为 Javascript 变量是通过引用分配/复制的,所以每次循环时,您只是在更新该内存位置的值。同时,您正在创建新的事件侦听器,但是它们都指向同一事物。
解决方案:在循环中声明您的 var。
function(eachImageTag){
let carouselIndicator = new COMPLEX_Img(carouselIndicatorProps, true);
// ^^^
...
}
推荐阅读
- flutter - Updating state in flutter
- javascript - How to render the landing page in server and the rest in client side?
- c - 为什么 %c 之前需要空格才能使代码正常工作?
- gerrit - How to hide some compiled files from showing up in gerrit review
- lua - 如何将字符串转换为变量名?
- html - 元素不遵守流量,并在浏览器中的意外位置呈现
- javascript - How to place text inside each bar of the chart using d3
- angular - Angular Input Date display from datatable
- flutter - Connection refused error when creating Http server using dart
- c# - 如何在 c# 中循环遍历表并在 datagridview 中显示结果?