JavaScript 匿名関数内の変数のスコープを理解しようとしています。
このコードは PhoneGap アプリ用であるため、Webkit ブラウザー内でのみ機能する必要があります。
以下のコード ブロックを考えると、setTimeoutへの引数はall_packs内の各項目で常に同じになりますか、それともpack_nameの値の変化 (jQuery ループの反復ごとに変化するため) が引数に影響しますか? つまり、新しい各行は、all_packs内の異なるアイテムに関連付ける必要があります。これは無名関数を使用する正しい方法ですか、それとも一部の行が同じ名前を参照することになりますか?
this.nameは、 all_packs内のアイテムを参照しなくなるため、タップ無名関数内では使用できません。その結果、最初に名前をpack_name内に隠しました。
TAP_DELAYが別の場所で設定された定数であり、start_workが有効な関数であり、all_packsがオブジェクトの配列であるとします。
// Load each pack
$( all_packs ).each( function(index) {
// Set vars
var pack_name = this.name;
var row = $( '#templates .row' ).clone( true );
// Append new row
$( '#test' ).append( row );
// Valid pack?
if ( this.valid ) {
// Configure for tap
row.on( 'tap', function() {
setTimeout( start_work, TAP_DELAY, pack_name );
});
} else {
setTimeout( start_work, TAP_DELAY, this.name );
}
});