2012-10-26 41 views
0

我在一個多級數組(對象?)中有兩段數據,我在使用2 for for循環的回調函數中引用它。但是,我無法弄清楚如何獲得當前循環值到回調中:它使用所有回調的最後一個值。回調引用和繼承javascript

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,並且總是調用相同的函數(最後一個函數)。

是的,這可能是一個奇怪的實現,不,我不能使用庫。如何從數組中獲取正確的值以傳入回調函數?

回答

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 s在循環中。

+0

我應該想到這個20分鐘前。DOH!謝謝! –

+0

聽起來像Javascript!:^) – rjz

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來查找實際元素?

+0

我將所有事件附加到文檔中,然後根據字符串(myobj ['myarr'] [k] [m] [0]')檢查目標並執行匹配的回調函數。原來,我試圖每個事件類型都有一個事件監聽器,然後通過一個數組尋找一個匹配的選擇器,它可以工作,但這裏的想法是,文檔上的多個事件偵聽器比每次檢查數組的速度更快,同時,範圍對於一個不能使用第三方庫的項目,我只是在探索替代的「實時」功能 –

+0

我希望我可以多次投票你的答案,這是非常有用的知識!但是,我打算用rjz回答這個例子,謝謝! –