以下の 2 つの例を見てください。どちらの例でも、変数i
には 0 ~ 9 が割り当てられています。最初の例では、タイムアウト関数が呼び出されるまでに、既に値 9 が割り当てられています。タイムアウトが設定されたときのi
値はわかりません。i
for(var i = 0; i < 10; i++) {
var callback = function() {
alert('The first test returns: ' + i);
};
if(i === 0) setTimeout(callback, 2000);
}
2 番目のオプションでは、値を新しいコンテキストに渡すことで値を永続化できi
ます (この用語が正しくない場合は訂正してください)。
for(var i = 0; i < 10; i++) {
var callback = (function(i) {
return function() {
alert('The second test returns: ' + i);
}
})(i);
if(i === 0) setTimeout(callback, 2000);
}
2 番目の例は、私が期待する値を示しています。では0
、ガベージ コレクションに関する限り、これはどのように機能するのでしょうか。GC はどの時点でこの値を削除しますか? コールバック関数の最後に? それとも、ある種のメモリリークが発生しますか?