[インタビューの質問 - 結果の出力] for (var i = 0; i < 2; i++) { setTimeout(function () { console.log(i) }, 0) } for (var

次の印刷結果を言います

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 になります。

Supongo que te gusta

Origin blog.csdn.net/owo_ovo/article/details/135253383
Recomendado
Clasificación