setTimeout() 함수의 결과가 5개의 6인 이유는 무엇인가요?
js 클로저를 사용하여 문제를 해결하고 원하는 1, 2, 3, 4, 5를 얻었지만 위 코드에 5개의 6이 나타나는 이유를 여전히 이해하지 못합니까?
人生最曼妙的风景,竟是内心的淡定与从容!
가장 먼저 이해해야 할 것은 JS의 작업 메커니즘이 대기열 메커니즘이라는 것입니다.
그래서 for 루프를 거치지 않고 그냥 setTimeout 작업을 큐 뒤에 두었습니다. 즉, setTimeout에서 실행되는 코드는 for 루프가 실행된 후에만 실행되므로 의 값은 다음과 같습니다. 그 당시에는 for 루프를 만족하지 않습니다. 값이 잘못된 경우 setTimeout 코드가 실행됩니다.
개인적인 의견이니 잘못된 점 있으면 지적해주세요
var를 let으로 변경
var는 전역 정의이고 i는 클로저를 형성하지 않으며 log(i)는 i의 최종 값을 인쇄합니다. 6
let은 블록 수준 도메인입니다
setTimeout에는 두 가지 특성이 있습니다. 즉, this는 컨텍스트의 this와 분리되어 있고 호출은 비동기적입니다.
이것은 [비동기]로 인해 발생하며 for 루프가 먼저 완료된 다음 setTimeout이 실행됩니다. 왜냐하면 for 루프는 실행될 때마다 끝에 6이 되기 때문입니다. - - 따라서 자연스럽게 setTimeout을 호출한 다음 나는 다섯 6
해결책 1:
해결책 2:
해결책 3:
가장 먼저 이해해야 할 것은 JS의 작업 메커니즘이 대기열 메커니즘이라는 것입니다.
그래서 for 루프를 거치지 않고 그냥 setTimeout 작업을 큐 뒤에 두었습니다. 즉, setTimeout에서 실행되는 코드는 for 루프가 실행된 후에만 실행되므로 의 값은 다음과 같습니다. 그 당시에는 for 루프를 만족하지 않습니다. 값이 잘못된 경우 setTimeout 코드가 실행됩니다.
개인적인 의견이니 잘못된 점 있으면 지적해주세요
var를 let으로 변경
var는 전역 정의이고 i는 클로저를 형성하지 않으며 log(i)는 i의 최종 값을 인쇄합니다. 6
let은 블록 수준 도메인입니다
으아악setTimeout에는 두 가지 특성이 있습니다. 즉, this는 컨텍스트의 this와 분리되어 있고 호출은 비동기적입니다.
이것은 [비동기]로 인해 발생하며 for 루프가 먼저 완료된 다음 setTimeout이 실행됩니다. 왜냐하면 for 루프는 실행될 때마다 끝에 6이 되기 때문입니다. - - 따라서 자연스럽게 setTimeout을 호출한 다음 나는 다섯 6
해결책 1:
으아악해결책 2:
으아악해결책 3:
으아악