자바스크립트는 웹 개발에서 핵심적인 역할을 수행하는 프로그래밍 언어입니다. 이를 효율적으로 사용하려면 자바스크립트 엔진의 동작 원리를 이해하는 것이 중요합니다. 자바스크립트는 싱글스레드 기반의 언어로, 한 번에 하나의 작업만 처리할 수 있습니다. 따라서 비동기 작업, 블로킹 상황 등을 잘 다루기 위해 동작 원리를 알아야합니다.
자바스크립트 엔진은 다음과 같은 주요 구성 요소로 구성되어 있습니다:
2.5. Task Queue(또는 Callback Queue)
자바스크립트는 기본적으로 단일 스레드로 동작하기 때문에 블로킹 현상이 발생할 수 있습니다. 블로킹은 코드 실행 중 다음 코드의 실행을 막고 대기해야 할 때 발생합니다. 다음은 일부 블로킹 현상이 나타날 수 있는 코드 예시입니다:
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', false); // 동기적 요청
xhr.send();
console.log(xhr.responseText); // 응답 받기 전까지 블로킹
for (var i = 0; i < 1000000000; i++) {
// 반복문이 끝날 때까지 블로킹
}
console.log('반복문 종료'); // 반복문 실행 중에는 실행되지 않음
var input = prompt('이름을 입력하세요.'); // 사용자 입력 대기
console.log('입력한 이름:', input); // 입력을 받기 전까지 블로킹
// 비동기 함수
function longRunningTask() {
for (var i = 0; i < 1000000000; i++) {
// 반복문 실행
}
console.log('반복문 종료');
}
setTimeout(longRunningTask, 0);
console.log('비동기 함수 호출 이후'); // 비동기 함수 호출 이후 먼저 실행됨
Promise는 콜백 지옥을 해결하고 비동기 작업의 결과를 다루는 데 도움을 주는 객체입니다. Promise는 비동기 작업의 성공, 실패, 완료 상태 등을 표현하며, 연속적인 비동기 작업의 흐름을 조작할 수 있습니다.
async/await는 Promise를 기반으로 비동기 코드를 동기적으로 작성할 수 있게 해주는 문법적인 편의 기능입니다. async 함수 내에서 await 키워드를 사용하여 비동기 작업의 완료를 기다릴 수 있고, 동기적인 코드처럼 작성할 수 있습니다.
// Promise
function longRunningTask() {
return new Promise(resolve => setTimeout(resolve, 10));
}
async function run() {
for (var i = 0; i < 1000000000; i++) {
await longRunningTask(); // 비동기 대기
}
console.log('반복문 종료');
}
run();
이렇게 자바스크립트 엔진의 동작 원리, 주요 구성 요소, 블로킹 상황을 해결하는 방법에 대해 간략하게 알아보았습니다. 자바스크립트의 동작 원리를 이해하면 코드를 효율적으로 작성하고, 비동기 작업을 잘 다룰 수 있게 됩니다.
REFERENCE
https://joshua1988.github.io/images/posts/web/translation/how-js-works/terminate-page-popup.jpeg