tl; drの場合、テーブル内の行のクリックハンドラーを作成するときに、クロージャーを使用すると、関数は、以下のコードのように毎回異なる場所ではなく、メモリ内の同じ場所を指すようになります。
そうでなければ:
私はjavascriptを学んでいて、クロージャとは何か、なぜそれが役立つのかを理解していると思います。これが私の推論です。それが正しいか?
HTMLテーブルの場合、次のコードは、最初または2番目の行をクリックした場合でも、常に最後の行がクリックされていることを示しています。私の推論は、コードが3つの異なるスタックフレームを作成し、iが0、1、2に等しい場合に1つずつ作成することです。2は最新のスタックフレームであるため、fnPtrの戻り値は2を指します。
var table = document.getElementById("tableid3");
var rows = table.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
var curRow = table.rows[i];
//get cell data from first col of row
var cell = curRow.getElementsByTagName("td")[0];
var fnPtr = function() {
alert("row " + i + " data="+ cell.innerHTML);
}
curRow.onclick = fnPtr;
}
以下のコード(SOの質問から)はクロージャーを使用し、createfunc()のフレームである単一のスタックフレームのみを作成します。ただし、このフレーム内には、無名関数を指すローカル変数tmpがあります。createfunc()が0、1、および2で呼び出されると、戻り値は同じスタックフレーム(createfunc()のスタックフレーム内のスタックフレーム)を指します。これは、3つのスタックフレームが作成されないことを意味します。createfunc()が毎回戻る場合、戻り値スロットの値は、上記のコードのように毎回異なる場所ではなく、メモリ内の同じ場所を指します。
function createfunc(i) {
var tmp = function() { console.log("My value: " + i); };
console.log(tmp);
return tmp;
}
for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
クロージャがどのように機能するか理解していますか?