JavaScript 엔진은 단일 스레드에서 동작합니다. 이는 JavaScript 코드의 실행이 하나의 작업이 끝나기 전에 다른 작업을 시작할 수 없음을 의미합니다.
setTimeout 함수는 일정 시간이 경과한 후에 코드를 실행하도록 예약하는 함수입니다. 예를 들어, 다음과 같은 코드가 있다고 가정해보겠습니다.
setTimeout(() => console.log("Hello, world!"), 1000);
위 코드는 1초 후에 "Hello, world!"를 출력합니다. 그러나 setTimeout 함수를 구현하는 것은 JavaScript 엔진에서 비동기 작업을 처리해야 함을 의미합니다. 이것은 JavaScript 엔진이 동시에 여러 가지 작업을 수행할 수 있는 멀티 스레드 시스템에서만 가능합니다.
그래서, 대부분의 브라우저에서 setTimeout 함수는 Web API에 의해 구현됩니다. Web API는 JavaScript 엔진과는 별개의 스레드에서 동작하는 브라우저 제공 API입니다. setTimeout 함수는 Web API에 의해 처리되며, 일정 시간이 경과하면 이벤트 큐에 콜백 함수가 추가됩니다.
이벤트 루프는 JavaScript 엔진이 현재 실행 중인 작업이 완료되면 이벤트 큐에서 대기 중인 작업을 처리하게 합니다.
결론적으로, Web API가 setTimeout 함수를 핸들링하는 이유는 JavaScript 엔진이 단일 스레드에서 동작하기 때문입니다. Web API를 사용하면 비동기 작업을 처리하고 이벤트 루프를 통해 작업을 스케줄링 할 수 있으므로 JavaScript 코드를 비동기적으로 실행할 수 있습니다.
JavaScript가 처음 도입되었을 때에는 타이머 기능이 없었습니다. 그러나 웹 브라우저 환경에서는 타이머 기능이 필요했기 때문에, setTimeout과 setInterval 같은 함수가 추가되었습니다.
setTimeout 함수가 처음 도입된 시기는 JavaScript 엔진에서 이벤트 루프가 도입되기 전인 1990년대 중반부터였습니다. 이벤트 루프는 2000년대 초반에 도입되었습니다.
따라서, 이벤트 루프가 도입되기 이전에는 JavaScript에서 타이머 기능을 구현하기가 어려웠습니다. 이벤트 루프의 도입으로 인해 JavaScript 엔진이 비동기 코드를 처리할 수 있게 되었고, 타이머 기능을 구현하는 것도 가능해졌습니다.
하지만, 이벤트 루프가 없던 시절에도 setTimeout과 setInterval과 같은 함수를 구현하기 위해, 브라우저 제공 API인 Web API를 사용했습니다. Web API는 JavaScript 엔진과는 별개의 스레드에서 동작하는 브라우저 제공 API이기 때문에, 타이머 기능을 구현할 수 있었습니다.