それが何をするのかという質問については、すべてのコメントと他の回答を読んでください。彼らは絶対に正しいです。
なぜそれを使いたいのですか?このパターンは、クロージャーを使用するときによく見られます。次のコード スニペットの目的は、10 個の異なる DOM 要素にイベント ハンドラーを追加し、それぞれがその ID 属性を警告することです (例: 「You've clicked 3」)。これが実際の意図である場合は、これを行うためのはるかに簡単な方法があることを知っておく必要がありますが、学術的な理由から、この実装に固執しましょう。
var unorderedList = $( "ul" );
for (var i = 0; i < 10; i++) {
$("<li />", {
id: i,
text: "Link " + i,
click: function() {
console.log("You've clicked " + i);
}
}).appendTo( unorderedList );
}
上記のコードの出力は、最初に期待したものとは異なる場合があります。イベント ハンドラが起動された時点での i の値は「9」であるため、すべてのクリック ハンドラの結果は「You've clicked 9」になります。開発者が本当に望んでいたのは、イベント ハンドラーが定義された時点で i の値が表示されることです。
上記のバグを修正するために、クロージャを導入できます。
var unorderedList = $( "ul" ), i;
for (i = 0; i < 10; i++) {
$("<li />", {
id: i,
text: "Link " + i,
click: function(index) {
return function() {
console.log("You've clicked " + index);
}
}(i)
}).appendTo( unorderedList );
}
上記のコードは jsFiddle から実行および変更できます。
上記のコードを修正する 1 つの方法は、自己実行型の無名関数を利用することです。これは、名前のない関数を作成してすぐに呼び出すことを意味する凝った用語です。この手法の価値は、変数のスコープが関数内にとどまることです。そのため、最初にイベント ハンドラの内容を関数で囲み、すぐに関数を呼び出して i の値を渡します。そうすることで、イベント ハンドラーがトリガーされたときに、イベント ハンドラーが定義されたときに存在していた i の値が含まれます。
クロージャに関する詳細情報: JavaScript クロージャのユース ケース