はどのようにコールバック関数は、それが作成されたそこからローカル変数を保持することができますか?
簡単な例
私はビデオプレーヤーを作成しています。彩度、コントラスト、色相をコントロールするスライダがあります。ユーザーがスライダーを操作するとき、どのスライダーが変更されたのか、どのスライダーに変更されたのかを確認する必要があります。問題は、スライダの名前がこのonChangeコールバックの作成者のスコープのローカル変数であることです。このコールバックはどのようにスライダの名前を保持できますか?
HTML
<div id="saturation">
<div class="track"></div>
<div class="knob"></div>
</div>
</div>
<div id="contrast">
<div class="track"></div>
<div class="knob"></div>
</div>
</div>
<div id="hue">
<div class="track"></div>
<div class="knob"></div>
</div>
</div>
JS
var elements = [
'saturation',
'contrast',
'gamma'
];
for(var i = 0; i < sliders.size(); i++) {
new Control.Slider(
$(elements[i]).down('.knob'),
$(elements[i]).down('.track'), {
onChange: function(value) {
// ERROR: elements[i] is undefined
alert(elements[i] + ' has been changed to ' + value);
}
}
}
これは私の構文エラーを与えました。 – JoJo
これは正しいことだと思います。 onChange:function(){ return function(value){ alert(elements [i] + value); } }(要素[i]) – JoJo
これを見て、著者はreturn文を省略して賢明だと思った。 Lispのような言語はデフォルトで最後の式を返すだけです。残念ながらjavascriptはそれらの1つではありません:( –