2012-01-28 54 views
0

分配我做了這樣的代碼,以更方便的連接回調的事件:同一事件的回調函數 - 通過循環

dojo.ready(function() { 
    for(var action in page.actions) { 
     for(var key in page.actions[action]) { 
      (function() { 
       dojo.query(key).connect(action, function(evt) { 
        if(page.actions[action][key]() == false) 
         dojo.stopEvent(evt); 
       }); 
      })(); 
     } 
    } 
}); 

page = { 
    actions : 
    { 
     onclick : 
     { 
      "#page-action-one" : function() 
      { 
       alert("Action 1"); 
       return false; 
      }, 
      "#page-action-two" : function() 
      { 
       alert("Action 2"); 
       return false; 
      } 
     } 
    } 
}; 

但點擊「#頁面動作一個」一「#PAGE-行動二「做出同樣的警報(」行動2「)。我試圖使用cloer,但沒有效果。我現在,我可以用不同的方式,但我想現在,爲什麼會發生這種情況。

感謝您的提示。

回答

0

您試圖通過在匿名函數中包裝事件處理函數來修復閉包問題。但是關鍵在於你必須將循環變量(或變量)作爲參數傳遞給匿名函數 - 否則匿名函數包裝器什麼都不做。嘗試:

dojo.ready(function() { 
    for(var action in page.actions) { 
     for(var key in page.actions[action]) { 
      (function(action, key) { 
       dojo.query(key).connect(action, function(evt) { 
        if(page.actions[action][key]() == false) 
         dojo.stopEvent(evt); 
       }); 
      })(action, key); 
     } 
    } 
}); 

這種「修復」的actionkey當時的價值匿名函數被調用,所以匿名函數中的變量名僅適用於傳遞的參數,不要在命名變量外部作用域,它將在下一次循環迭代時更新。

+0

謝謝,確切地說。 – PavelKumpan 2012-01-28 21:21:35