JavaScriptはどうやってクローズドを使いますか?

1184 ワード

クローズドは基本的に内部関数であり、その範囲外の変数にアクセスできます.プライバシーの実現と関数工場の作成に利用できます.
配列を定義し、この配列を巡回し、3秒後に各要素の索引を印刷します.
まず不正な書き方を見てください.
const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function() {
    alert('The index of this number is: ' + i);
    console.log('The index of this number is: ' + i);
  }, 3000);
}
実行効果を見ます.
上の図のように、3秒後は毎回0、1、2、3ではなく4を印刷します.
理由:setTimeout関数が作成したのは、インデックスiのループを含む外部作用領域にアクセスできる関数(クローズド)であるからである.3秒後、iの値は4に変わった.
正しい書き方:
const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function(i_local){
    return function () {
      alert('The index of this number is: ' + i_local);
      console.log('The index of this number is: ' + i_local);
    }
  }(i), 3000)
}
const arr = [10, 12, 15, 21];
for (let i = 0; i < arr.length; i++) {
  setTimeout(function() {
    alert('The index of this number is: ' + i);
    console.log('The index of this number is: ' + i);
  }, 3000);
}