좋아, 이 전체 setTimeout을 0ms로 분석해 보겠습니다. 언뜻 보면 "형, 0ms는 바로 실행된다는 뜻이겠죠?"라고 생각하실 겁니다. 그러나 JavaScript에는 고유한 분위기가 있으며 0ms는 예상만큼 즉각적이지 않습니다. 함께 알아 봅시다.
우리가 분석하는 코드는 다음과 같습니다.
const promise = new Promise((resolve, reject) => { console.log(1); setTimeout(() => { console.log("timerStart"); resolve("success"); console.log("timerEnd"); }, 0); console.log(2); }); promise.then((res) => { console.log(res); }) console.log(4);
그리고 출력은?
1 2 4 timerStart success timerEnd
setTimeout(() => { ... }, 0)을 보면 내부 코드가 0ms 후에 즉시 실행되는 것처럼 느껴집니다. 하지만 아니요, JavaScript는 "형, 나한테 나만의 시스템이 있으니 차례를 기다리세요!"와 같습니다.
JavaScript는 코드를 직접 실행하는 것이 아니라 작업을 처리하기 위한 이벤트 루프라는 멋진 시스템을 갖추고 있습니다. 이렇게 생각해보세요:
주요 작업(동기식):
console.log()와 같은 것이 먼저 실행됩니다. 이는 직접적으로 대면하는 작업입니다.
마이크로태스크(약속):
타이머가 있기 전에도 약속은 다음에 옵니다. 마치 VIP 티켓을 받은 것 같습니다.
작업 대기열(setTimeout과 같은 타이머):
타이머는 줄 뒤쪽으로 이동하며 마이크로 작업이 완료된 후에만 실행됩니다. 0ms를 줘도 기다립니다.
어떤 일이 일어나고 있는지 단계별로 살펴보겠습니다.
약속이 생성됨:
약속 .then():
console.log(4):
마이크로태스크 실행(VIP):
작업 대기열 실행:
0ms라고 했음에도 불구하고 setTimeout은 항상 연기됩니다. JavaScript는 무슨 일이 있어도 이를 작업 대기열에 푸시합니다. 시스템은 작업 대기열을 터치하기 전에 먼저 모든 동기 작업과 마이크로 작업(약속)을 지웁니다.
간단히 말하면:
0ms는 시간이 아니라 차례를 기다리는 시간입니다.
롤러코스터를 타기 위해 줄을 서 있다고 상상해 보세요.
코드의 이벤트 순서는 다음과 같습니다.
0ms가 실제로 어떻게 작동하는지 이해하면 더 나은 비동기 코드를 작성하는 데 도움이 됩니다. 친구가 JavaScript에서 무작위 지연을 디버깅할 때 친구에게 설명하는 것도 멋진 방법입니다.
그러므로 다음에 setTimeout(() => { ... }, 0)이 표시되면 시간에 관한 것이 아니라는 점만 기억하세요. 우선순위입니다!
위 내용은 JavaScript에서 setTimeout(..., )은 실제로 무엇을 의미합니까? (이벤트 루프 설명!)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!