我在多级数组(对象?)中有两个数据,我在一个带有2个for循环的回调函数集中引用它。但是,我无法弄清楚如何将当前循环值转换为回调:它使用所有回调的最后一个值。
for (k in myobj.myarr) {
for (m in myobj.myarr[k]){
document.addEventListener(
k,
function(event){
myobj.myfn(event, myobj['myarr'][k][m][0], myobj['myarr'][k][m][1]);
},
true
);
}
}
其中myobj['myarr'][k][m][0]
是字符串,myobj['myarr'][k][m][1]
是函数。我在函数中有console.log
,并且总是调用相同的函数(最后一个)。
是的,这可能是一个奇怪的实现,不,我不能使用库。如何从数组中获取正确的值以传递回调函数?
答案 0 :(得分:3)
您真正想要的是绑定到只有一个侦听器知道的上下文。为清楚起见,您可以定义一个这样的函数:
function doEvent(k, myobj, m) {
document.addEventListener(
k,
function(event){
myobj.myfn(event, myobj['myarr'][k][m][0], myobj['myarr'][k][m][1]);
},
true
);
}
...并为数组中的每个对象调用它:
for (k in myobj.myarr) {
for (m in myobj.myarr[k]){
doEvent(k, myobj, m);
}
}
现在,事件将特定于循环中各自的m
。
答案 1 :(得分:1)
你可以像这样“锁定”迭代器的值:
for( k in myobj.myarr) {
for( m in myobj.myarr[k]) {
(function(m,k) {
// code that depends on m and k here
})(m,k);
}
}
我不得不问,你似乎正在创建大量的事件监听器,这对性能有害。您是否无法将事件处理程序委托给父元素并使用event.target
来查找实际元素?