概要
かつては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