2017-12-08 9 views
0

誰かが私を助けることができれば、私は本当に、明確に理解していなかった何かがあります:非同期スコープ

let arr = [1,2,3,4,5,6,7]; 

let b = 0 
for (let a of arr) { 
    setTimeout(() => { 
     console.log(b, a) 
    }, 2000) 
    b = b + 1; 
} 
/* Output 
7 1 
7 2 
7 3 
7 4 
7 5 
7 6 
7 7 
*/ 

のは、2秒後に、変数bは、その後、7に等しいためbが7に等しいとしましょうなぜaの動作がbと異なるのですか?

+2

bは、forループによってカウントアップされるグローバル変数です(常に同じ変数b)。 aはあなたのforループで宣言されているので、各反復で新しい値を持つaの新しいインスタンスを取得します。このインスタンスはforループ内で使用でき、setTimeoutに渡される無名関数にバインドされます。 letの詳細については、MDNをご覧ください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let – glutengo

答えて

1

スコープ変数がletキーワードでどのように機能するかが異なります。この場合、ループの反復ごとに新しいaを定義しています。しかし、反復ごとに同じb変数です。

タイムアウトは、ループが終了するまで実際には起動しません。この時点までに、各タイムアウト機能スコープに異なるaが与えられましたが、同じ最終値bを取得しています。