2012-01-28 21 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