中級 › forループのvarをletに変えないとコールバックが同じ値を指す › パターン1
forループのvarをletに変えないとコールバックが同じ値を指す
varはブロックスコープを持たないため、ループ内で生成した関数はすべて同じ変数を共有します。
1 function makeGetters() { 2 const getters = []; 3 for (_____ i = 0; i < 3; i++) { ^ 4 getters.push(function() { return i; }); 5 } 6 return getters; 7 } 8 const getters = makeGetters(); 9 console.log(getters[0](), getters[1](), getters[2]());
出力: 3 3 3期待: 0 1 2 (エラーにはなりません)
空欄を埋めて実行を通す
varはブロックスコープを持たないため、3つの関数は同じiを共有します。呼び出された時点でのiの値(ループ終了後の3)を全員が参照します。letはループのたびに新しい束縛を作るため、それぞれの関数が自分の回のiを覚えます。
次の問題