JS.next

JavaScriptの最新実装情報を追うブログ

for文でのlet変数が毎ループ新スコープを持つようになった

概要

かつてはfor文初期化句で宣言された変数は、for文の直前で宣言されたように振舞っていたが、各ループでスコープを引きづらないように仕様が変更され、V8も追従した。


for (let i = 0; i < 5; i++) {
  ~~~
}

これは今までは次のコードと等価だった。

{
  let i = 0
  for (; i < 5; i++) {
    ~~~
  }
}

つまりfor文中で関数を定義するとこうなっていた。

let funs = []

for (let i = 0; i < 5; i++) {
  funs.push(function () { return i })
}

funs.map(function (fun) { return fun() })
  // [5,5,5,5,5] 

この結果が[0,1,2,3,4]になるのが今回の変更である。
つまり一番最初のコードはこれと等価になる。

for (let _i = 0; _i < 5; _i++) {
  let i = _i
  ~~~
}


変更されるバージョン

V8 3.27.14