var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value: " + i);
  };
}
for (var j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}これは出力します:
私の価値:3
私の価値:3
私の価値:3
それを出力したいのですが:
私の値:0
私の値:1
私の値:2
関数の実行の遅延がイベントリスナーの使用が原因である場合にも、同じ問題が発生します。
var buttons = document.getElementsByTagName("button");
// let's create 3 functions
for (var i = 0; i < buttons.length; i++) {
  // as event listeners
  buttons[i].addEventListener("click", function() {
    // each should log its value.
    console.log("My value: " + i);
  });
}<button>0</button>
<br />
<button>1</button>
<br />
<button>2</button>…または非同期コード、例えばPromisesの使用:
// Some async wait function
const wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));
for (var i = 0; i < 3; i++) {
  // Log `i` as soon as each promise resolves.
  wait(i * 100).then(() => console.log(i));
}編集:それはまたループ内for inで明らかですfor of:
const arr = [1,2,3];
const fns = [];
for(i in arr){
  fns.push(() => console.log(`index: ${i}`));
}
for(v of arr){
  fns.push(() => console.log(`value: ${v}`));
}
for(f of fns){
  f();
}この基本的な問題の解決策は何ですか?




funcs数値インデックスを使用している場合、配列になりたくないですか?頭を上げただけです。