2017-12-08 1 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 
*/ 

의이 b 7이 때문에 초와 동일 생각한 후, 변수 b 7과 동일 한 후, 왜 ab과 다른 동작을합니까?

+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을 얻습니다.