// Example
function func1() {
console.log('func1');
func2();
}
function func2() {
setTimeout(function () {
console.log('func2');
}, 0);
func3();
}
function func3() {
console.log('func3');
}
func1(); // func1 => func3 => func2
function func1() {
console.log('func1');
func2();
}
function func2() {
// <button class="foo">foo</button>
const elem = document.querySelector('.foo');
elem.addEventListener('click', function () {
this.style.backgroundColor = 'indigo';
console.log('func2');
});
func3();
}
function func3() {
console.log('func3');
}
func1();
함수 func1이 호출되면, 함수 func1은 Call Stack에 쌓임
함수 func1이 함수 func2를 호출하므로, 함수 func2가 Call Stack에 쌓임
함수 func2가 호출되면, addEventListener가 호출됨
macrotask
<script src="...">
가 로드될 때, 이 스크립트를 실행하는 것mousemove
이벤트와 이벤트 핸들러를 실행하는 것setTimeout
에서 설정한 시간이 다 된 경우, 콜백 함수를 실행하는 것microtask
promise
를 사용해 만듬promise
의 .then/catch/finally
핸들러가 microtask가 됨await
를 사용해 만들기도 함JavaScript 엔진은 macrotask 하나를 처리할 때마다 또 다른 macrotask나 렌더링 작업을 하기 전에 microtask queue에 쌓인 microtask 전부를 처리함
setTimeout(function() { // (A)
console.log('A');
}, 0);
Promise.resolve().then(function() { // (B)
console.log('B');
}).then(function() { // (C)
console.log('C');
});
setTimeout
함수는 콜백함수 A를 Task Queue(Macrotask Queue)에 추가함then
메서드는 콜백함수 B를 Microtask Queue에 추가함then
메서드가 콜백함수 C를 Microtask Queue에 추가함setTimeout(f)
를 사용하기
setTimout(f,0)
의 '0'
- 브라우저는 내부적으로 타이머의 최소단위(Tick)를 정하여 관리하기 때문에, 실제로는 즉시가 아니라 그 최소단위만큼 지난 후에 태스크 큐에 추가되게 됨
- 이 최소단위는 브라우저별로 조금씩 다름
- 예) 크롬 브라우저의 경우, 최소단위로 4ms 사용
queueMicrotask(f)
사용하기;promise
의 .then/catch/finally
핸들러 사용하기