ここにはほとんど正しい説明がたくさんありますが、驚いたことに、ここで重要な概念である閉鎖を捨てた人は誰もいません。
基本的に何が起こっているかというと、2 つの関数を宣言すると、それらが宣言されたスコープが Closure になります。つまり、そのクロージャ内の変数は引き続き関数で使用できます。言い換えると:
$(document).ready(function(){
// this begins a closure
var msg ="hi";
// you are simply declaring a function here, not calling it
$("#test1").click(function(){alert(msg)});
msg ="hello";
// ditto
$("#test2").click(function(){alert(msg)});
// the end of the closure...msg has the value "hello"
});
その後、しばらくすると、クリック イベントが呼び出されます。クリック イベントに関連付けられている関数は、引き続きクロージャにアクセスできます (内部の値msg
は「hello」です)。
クロージャ内で変数の値を「キャプチャ」する従来の方法は、「即時呼び出し関数式」(IIFE)を作成することです。基本的に、これは、変数の即時値を含むまったく新しいクロージャーを作成するものと考えることができます。次のように IIFE を使用するようにコードを書き直すことができます。
$(document).ready(function(){
// this begins a closure
var msg ="hi";
// the following creates an anonymous function with a single parameter
// AND invokes it immediately, creating another closure in which the
// value of msg1 is "hi".
(function(msg1){
$("#test1").click(function(){alert(msg1)});
})(msg);
msg ="hello";
// ditto
(function(msg2){
$("#test2").click(function(){alert(msg2)});
})(msg);
});
これにより、何が起こっているのか、探しているものを取得する方法が少し明確になることを願っています.