gpt4 book ai didi

javascript - 在 JavaScript 闭包中重新定义局部变量

转载 作者:行者123 更新时间:2023-11-28 02:46:49 27 4
gpt4 key购买 nike

我的代码如下所示:

for( var i=0; i<10; i++ ) {
var someClickableObject = new Object();
someClickableObject.index = i;

eventListenerFunction(someClickableObject, 'click', function() {
alert(someClickableObject.index);
});
}

所以我创建了一堆可点击的对象,给每个对象一个等于循环索引的属性,在对象上设置一个点击事件来提醒其索引属性。

我希望每个对象都向创建它的索引 i 发出警报。相反,所有对象都会发出警报 9。我认为这是因为事件监听器在对象上形成了一个闭包,该闭包在每次迭代时都会重新定义。

关于如何解决这个问题有什么想法吗?

最佳答案

问题实际上与您所写的相反:所有函数共享相同闭包。 (编辑 - 重新阅读您所写的内容后,我不确定它是否与任何内容“相反”;重点是您传递给“eventListenerFunction”的所有这些小函数将共享相同的变量“someClickableObject”,因此在循环结束时它们都将引用最后一次迭代中创建的对象!)

要修复它,您需要以某种方式引入另一个作用域:

eventListenerFunction(someClickableObject, 'click', (function(obj) {
return function() {
alert(obj.index);
};
})(someClickableObject));

这引入了一个匿名函数。这个小函数是通过对局部变量的引用来调用的,它具有创建另一个作用域的效果。该函数返回实际传递给“eventListener”事物的函数。它现在有了自己的“someClickableObject”副本。

但是,这只是一个副本。就您而言,这没问题,因为您在每次迭代时都会创建一个新对象。在实践中,我几乎从来不用担心这种情况;通常我需要担心的是浅拷贝(因为它通常只是一个计数器,或者一个字符串值键,或者类似的东西)。

关于javascript - 在 JavaScript 闭包中重新定义局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4737437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com