자바 스크립트는 싱글 스레드로 작동하며 이벤트 루프를 통해 비동기적으로 작업을 처리한다.
이벤트 루프는 이벤트 발생 시 해당 이벤트를 처리하는 작업을 큐에 넣고, 이벤트 루프의 작업이 끝나면
큐에 있는 작업을 순차적으로 처리한다.
이벤트 루프는 크게 두가지의 큐를 갖고 있다.
콜 스택과 테스크 큐
콜스택은 현재 실행중인 함수의 정보를 담는 자료구조이고,
테스크 큐는 비동기적으로 처리되어야 할 작업을 담는 자료구조이다.
이벤트 루프의 동작 과정은 아래와 같다.
1. 현재 실행 중인 작업을 콜 스택에 담는다
2. 이벤트가 발생하면, 해당 이벤트를 처리하는 작업을 테스크 큐에 담는다
3. 콜 스택이 비어 있으면, 테스크 큐에서 작업을 가져와 콜 스택에 담고 실행
4. 다시 1번으로 돌아가 반복
자바스크립트는 콜 스택이 비어있을 때에만 테스크 큐에 있는 작업을 실행한다.
이렇게 하으로써 자바스크립트는 비동기적으로 작업을 처리할 수 있게 된다.
콜백 함수는 자바 스크립트에서 가장 기본적인 비동기 처리 방식 중 하나이다
콜백 함수란 다른 함수의 인자로 전달되어서 특정 작업이 끝난 후에 실행되는 함수를 말하는것
예를 들어 setTimeout 함수는 특정 시간이 지난 후에 콜백 함수를 실행하는 함수
setTimeout(function() {
console.log('5초가 지났습니다.');
}, 5000);
위의 코드에서는 setTimeout 함수에서 첫번째 인자로 익명함수를 전달했고
이 익명 함수가 바로 콜백함수이다, 이 함수는 5초 후에 실행된다.
콜백 함수는 비동기적인 처리를 할때 매우 유용하다
예를 들어 서버로부터 데이터를 받아와야 할 때는 네트워크 지연 등의 이유로 데이터를
즉시 받아올 수 없는 경우가 생길 수 있다.
이때 콜백 함수를 사용하여 데이터를 받아온 후에 실행되어야 할 작업을 정의할 수 있다
하지만 콜백 함수를 남발하면 코드가 복잡해질 수 있다, 콜백 함수가 중첩되어 사용되는
콜백 지옥 문제가 발생할 수 있고 이는 코드 가독성을 떨어트리고 유지 보수를 어렵게 만든다.
때문에 최근에서는 Promise와 async/await 과 같은 새로운 비동기 처리 방식이 나오면서 콜백 함수의 사용이 줄어들고 있다.