エンクロージャの問題

610 ワード

fun aのスキャナーは1つ、お問い合わせのスキャナーは5つです
a Scopeでiは0->5,ドアのScopeでiは0,1,2,3,4
function a() {
  for (var i = 0; i < 5; i++) {
    setTimeout(() => {
      console.log(i);
    }, i * 1000);
  }
}
a();
//5
//5
//5
//5
//5

varには関数単位スキャンがあるので、i値はforではなく、親a関数で検索されます.
この場合、a関数は、iがリング終了の5であるため、5を出力する.
function a() {
 for (let i = 0; i < 5; i++) {
   setTimeout(() => {
     console.log(i);
   }, i * 1000);
 }
}
a();
//0
//1
//2
//3
//4
varをletに変更すると、letはブロックレベルのscopeを持つため、iの値はforで使用されます.
従って、通常iは0,1,2,3,4を出力する.