2016-07-22 3 views
1

私はよく似たような質問をしましたが、まだ何か不足しているように感じます。私は次のコードを持っています:JavaScriptを使って変数を値で渡す

_setHotKeys: function(values, buttons){ 
    var hotKeyMap = { 
      target: document, 
      binding:[] 
     }; 

     values.forEach(function(value, index){ 
      if(value.hotkey){ 
       this.button = buttons[index]; 
       hotKeyMap.binding.push({ 
        key: value.hotkey, 
        fn: function(key, event){ 
         this._handleFillInValueButtonToggle(this.button, true); 
        }, 
        scope: this 

       }); 
      } 

     }, this)  


     var keyMap = new Ext.util.KeyMap(hotKeyMap); 
}, 

この機能では、Ext.jsを使ってホットキーを設定しようとしています。このコードでは、valueアレイ内の各値のホットキーが設定されますが、すべてthis.buttonbuttonsアレイの最後のボタンに設定されています。私の結論は、配列への値ではなくthis.buttonへの参照をプッシュしているので、ループが進むにつれて、この値が変化します。参照の代わりに値をプッシュするように設定するにはどうすればよいですか?

+0

「this._handleFillInValueButtonToggle(buttons [index]、true)」はどうですか? – elclanrs

+0

http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

+0

@elclanrs that worked!何らかの理由で 'buttons 'がスコープ外にあると思ったのですが、 –

答えて

4

あなたはその結論と正しい軌道にいる。

ループの繰り返しごとに、this.buttonをループのそのインデックスのボタンと等しくなるように割り当てました。これを打ち破れば、それは見えます。

また、ループの最後に到達するまで続きます。ループの最後に達すると、this.buttonは配列の最後のボタンと同じになります。ホットキーイベントが実行されると、当然、配列内の最後のボタンを指すthis.buttonへの参照が使用されます。

classプロパティへの参照を代入するのではなく、ボタン[index]参照をハンドラに直接渡す必要があります。

... 
fn: function(key, event) { 
    this._handleFillInValueButtonToggle(button[index], true); 
} 
関連する問題