次の印刷結果を言います
for (var i = 0; i < 2; i++) {
setTimeout(function () {
console.log(i) }, 0)
}
for (var i = 0; i < 2; i++) {
(function (i) {
setTimeout(function () {
console.log(i) }, 0)
}(i))
}
最初のループの出力は 2 つの 2 になります。これは、最初のループで setTimeout 関数が 2 つの非同期タスクを作成しますが、これら 2 つのタスクはループの終わりまで実行されず、同じ変数 i を共有するためです。非同期タスクが実行されるとループが終了し、i の値が 2 になっているため、出力結果は 2 が 2 つになります。
注意
: for ループ内で i を var で宣言すると、var で宣言された変数のスコープがブロック レベルではなく関数レベルになるため、i にグローバルにアクセスできます。外部からアクセスしたくない場合は、let を使用してください。
for (var i = 0; i < 2; i++) {
setTimeout(function () {
console.log(i) }, 0)
}
console.log(i) // 2
2 番目のループでは、即時実行関数を使用して現在の i 値を setTimeout に渡します。これにより、各ループは新しいスコープを作成して現在の i 値を渡し、各 setTimeout が独自の変数 i を持つようになります。したがって、出力は 0 と 1 になります。