Code Fix

中級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 (エラーにはなりません)

空欄を埋めて実行を通す

広告
広告スロット(未設定)

forループのvarをletに変えないとコールバックが同じ値を指す

ループが終わったあとに関数を呼び出すと、全て最後の値を参照します。letはループの繰り返しごとに新しい束縛を作るため、この問題が起きません。

このエラーの解説と類題をまとめて見る →

広告
広告スロット(未設定)