回调引用和继承javascript

时间:2012-10-26 15:00:30

标签: javascript arrays inheritance for-loop

我在多级数组(对象?)中有两个数据,我在一个带有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,并且总是调用相同的函数(最后一个)。

是的,这可能是一个奇怪的实现,不,我不能使用库。如何从数组中获取正确的值以传递回调函数?

2 个答案:

答案 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来查找实际元素?