2012-01-28 9 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; 
      } 
     } 
    } 
}; 

しかし、「#ページ・アクション-1」をクリックして「#PAGE- 「アクション2」は同じアラートを作成します(「アクション2」)。私はクローラーを使用しようとしましたが効果はありませんでした。私は今、私はそれを別の方法で作ることができますが、私は今、なぜこれが起こっているのですか?

ヒントをお願いします。

答えて

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

関連する問題