What is the Event Loop in Javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
setTimeout(function doSomething() {
// Do stuff.
}, 0);
0λ°λ¦¬μ΄λ₯Ό κΈ°λ€λ¦¬λ μ΄μ λ 무μμ
λκΉ? κ·Έλ₯ μ§μ doSomething
μ callνλ κ² μ΄λμ?
μ λ΅μ μ΄ setTimeout
μ΄ Javascript μμ§μ 0ms μ΄ν μμ
μ μ€ννλλ‘ μ§μνμ§ μλλ€λ κ²μ
λλ€.
μ€νλ €, Javascript μμ§μ μ΅μ 0ms νμ doSomething
μ μ€ννλΌκ³ μ§μν©λλ€.
μ΄κ²μ Javascriptμ μλ λ°©μμ μ΄ν΄νκΈ° μν ν΅μ¬ ꡬλΆμ
λλ€. doSomething
μ κ±°μ μ¦μ μ€νλκ±°λ λͺ μ΄ νμ μ€νλ μ μμ΅λλ€.
μλ₯Ό λ€μ΄, λ€μ μ½λλ₯Ό κ³ λ €ν©λλ€.
let startTime = Date.now();
setTimeout(function() {
console.log(Date.now() - startTime);
}, 500);
while (Date.now() - startTime < 1000) {} // Pause for 1 second.
Javascriptβs stack frames
ν¨μλ₯Ό νΈμΆνλ©΄ "stack frame"μ΄ μμ±λ©λλ€. stack frameμ ν¨μμ μ μΈλ λͺ¨λ λ³μλ₯Ό μ μ₯νλ 컨ν μ΄λμ λλ€.
κΈ°λ₯ μ€νμ΄ μλ£λλ©΄ ν΄λΉ stack frameμ΄ μμ λ©λλ€. κΈ°λ₯ λ΄μμ ν¨μλ₯Ό νΈμΆνλ©΄ 2κ°μ stack frameμ΄ μμ±λ©λλ€. μ΄κ²λ€μ μ€νμ λμ λλ€.
첫 λ²μ§Έ ν¨μμ μν΄ μμ±λ stack frameμ "initial frame"μ΄λΌκ³ ν©λλ€. μ΄ κΈ°λ₯μ λ€λ₯Έ κΈ°λ₯μ μ¬κ·μ μΌλ‘ νΈμΆν μ μμΌλ©° μ²μμ νλμ κΈ°λ₯λ§ νΈμΆν ν μλ°±λ§ κ°μ κΈ°λ₯μ΄ νΈμΆλ μ μμ΅λλ€.
λͺ¨λ κΈ°λ₯ μ€νμ΄ μλ£λλ©΄ μ΄κΈ° νλ μμ΄ μ€νμμ μ κ±°λ©λλ€. νμ¬ μ€ν μ€μΈ κΈ°λ₯(i.e. none of your code)μ΄ μμ΅λλ€.
Javascriptβs message queue
λͺ¨λ κΈ°λ₯μ΄ μ€νλ ν μ κΈ°λ₯μ μ΄λ»κ² νΈμΆν©λκΉ?
λ©μμ§ νμ μΆκ°νκΈ°λ§ νλ©΄ λ©λλ€! Javascriptμλ "λ©μμ§"μ λκΈ°μ΄μ΄ μμ΅λλ€.
κ° λ©μμ§μλ λ¨μΌ κΈ°λ₯μ΄ ν¬ν¨λμ΄ μμ΅λλ€. μ€νμ΄ λΉμ΄ μμΌλ©΄(μ¦, λͺ¨λ κΈ°λ₯μ΄ μ€νλκ³ λλ©΄) Javascript μμ§μ λ©μμ§ νκ° λΉμ΄ μλμ§ νμΈν©λλ€.
λΉμ΄ μμ§ μμΌλ©΄ μμ§μ΄ 첫 λ²μ§Έ λ©μμ§λ₯Ό μ κ±°νκ³ λ΄λΆ κΈ°λ₯μ μ€νν©λλ€.
κΈ°λ₯μ΄ μ€νλλ©΄ μ μ€ν νλ μ(μ΄κΈ° νλ μ)μ΄ μμ±λμ΄ μ€νμ μΆκ°λ©λλ€.
κΈ°λ₯ μ€νμ΄ μλ£λλ©΄ μ΄κΈ° νλ μμ΄ μ€νμμ μ κ±°λκ³ , Javascript μμ§μ λ©μμ§ νμ λ€λ₯Έ λ©μμ§κ° μλμ§ νμΈν©λλ€. λ©μμ§ λκΈ°μ΄μ΄ λΉμ΄ μμ λκΉμ§ μ΄ μμ μ΄ λ°λ³΅λ©λλ€.
Adding to the message queue
μ΄μ Javascriptμλ "λ©μμ§"κ° μ€μ μκ³ μμ΅λλ€.
Javascriptλ λ©μμ§ νκ° λΉμ΄ μμ λκΉμ§ κ° λ©μμ§μ κΈ°λ₯μ μ€νν©λλ€. μ μ΄μ μ΄λ»κ² λ©μμ§κ° λ©μμ§ νμ μκ²λλμ?
λ©μμ§ νμ μΆκ°νλ κ°μ₯ μΌλ°μ μΈ λ°©λ²μ μ΄λ²€νΈ(DOM μμ, XMLHttpRequest, μλ² λ³΄λΈ μ΄λ²€νΈ λ±), setTimeout λ° setIntervalμ λλ€.
μ§μ° μκ°μ΄ 500msμΈ setTimeoutμ μ€ννλ©΄ Javascript μμ§μ 500ms λ΄μ λ©μμ§ νμ μ½λ°± κΈ°λ₯μ μΆκ°νλΌλ λ©μμ§κ° νμλ©λλ€.
μ€νμ μ΄λ―Έ μ€ν μ€μΈ κΈ°λ₯λ μμ μ μμ΅λλ€. μ½λ°± ν¨μλ μ€νμ΄ λΉμ΄ μμ λκΉμ§ κΈ°λ€λ €μΌ μ€νν μ μμ΅λλ€.
μ΄κ²μ΄ ν¨μκ° μ΅μ 500ms νμ μ€νλλ μ΄μ μ λλ€. 1000ms λμ μΌμ μ€μ§ν μμ μμμ setTimeout μ½λ°±μ μ€νλκΈ° μ μ 1000ms β 500ms = 500ms λμ λ©μμ§ λκΈ°μ΄μ μμ΄μΌ ν©λλ€. μ΄λ²€νΈλ λν μ¦μ μ€νλλ λμ μ΄λ²€νΈ λκΈ°μ΄μ μΆκ°λ©λλ€.
let startTime = Date.now();
document.onclick = function() {
console.log(Date.now() - startTime);
};
while (Date.now() - startTime < 1000) {} // Pause for 1 second.
루νκ° μννλ λμ μΉ νμ΄μ§λ₯Ό ν΄λ¦νλ©΄ ν΄λ¦ μ²λ¦¬κΈ°κ° μ¦μ μ€νλμ§ μμ΅λλ€. λμ λ©μμ§ λκΈ°μ΄μ μΆκ°λ©λλ€.
루νκ° μλ£λλ©΄ Javascript μμ§μ΄ Click handlerλ₯Ό μ€νν©λλ€. console.log
λ 1000 λλ κ·Έ μ΄μμ μΆλ ₯ν΄μΌ ν©λλ€.
μ΄μ κΈ°λ₯μ μ’ λ£νκ³ ν΄λ¦ νΈλ€λ¬λ₯Ό μμνλ λ° λͺ λ°λ¦¬μ΄κ° 걸릴 μ μκΈ° λλ¬Έμ μ½κ° λ λμ μ μμ΅λλ€.
The event loop
μ΄λ²€νΈ 루νλ λ©μμ§ νμ λ λ§μ λ©μμ§κ° μλμ§ νμΈνλ 루νλ₯Ό λνλ λλ€. λμ μμ€μμ 루νλ λ€μκ³Ό κ°μ΅λλ€.
while (await messageQueue.nextMessage()) {
let message = messageQueue.shift();
message.run();
}
λ©μμ§ λκΈ°μ΄μ λ©μμ§κ° μλ κ²½μ° λ©μμ§ λκΈ°μ΄μμ λ€μ λ©μμ§κ° μ κ±°λκ³ κ΄λ ¨ κΈ°λ₯μ΄ μ€νλ©λλ€.
κ·Έλ μ§ μμΌλ©΄ λ©μμ§ λκΈ°μ΄μ μ λ©μμ§κ° μΆκ°λ λκΉμ§ κΈ°λ€λ¦½λλ€. μ΄λ²€νΈ 루νλ Javascriptμμ λΉλκΈ°νλ₯Ό νμ©νλ κΈ°λ³Έ λͺ¨λΈμ λλ€.
Javascriptλ λ¨μΌ μ€λ λμ΄κΈ° λλ¬Έμ Javascriptμμ μ΄λ²€νΈ 루νκ° νμν©λλ€.
λ€μ€ μ€λ λ μΈμ΄μμ μ΄λ²€νΈκ° νΈλ¦¬κ±°λλ©΄ ν΄λΉ μ΄λ²€νΈ νΈλ€λ¬κ° μ¦μ μ€νλ μ μμ΅λλ€.
μ΄λ―Έ μ€ν μ€μΈ κΈ°λ₯μ΄ μλ κ²½μ° μ΄λ²€νΈ μ²λ¦¬κΈ°κ° μ μ€λ λμμ μ€νλ μ μμ΅λλ€.
μΉ μμ μλ₯Ό μ¬μ©νμ§ μλ ν Javascriptμμλ λΆκ°λ₯ν©λλ€.
Javascriptλ λ¨μΌ μ€λ λμ΄κΈ° λλ¬Έμ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ€ννκΈ° μ μ μ΄μ κΈ°λ₯μ΄ μ€νλ λκΉμ§ κΈ°λ€λ €μΌ ν©λλ€.
μ¬λ¬ μ΄λ²€νΈ νΈλ€λ¬κ° νΈλ¦¬κ±°λ κ²½μ° νΈλ¦¬κ±°λ μμλλ‘ μ€νλμ΄μΌ ν©λλ€. μ΄κ²μ΄ Javascriptκ° λ©μμ§ νμ μ΄λ²€νΈ 루νκ° νμν μ΄μ μ λλ€.
μ΄λ²€νΈ 루νλ μ²μμλ νΌλμ€λ¬μΈ μ μμ΅λλ€. μ΄λ»κ² μλνλμ§ μμλ΄κΈ° μν΄ λͺ κ°μ§ μ½λλ₯Ό κ°μ§κ³ λ Έλ κ²μ μΆμ²ν©λλ€. λΆννκ²λ (μ κ° μλ ν) μ΄λ€ λΈλΌμ°μ μμλ λ©μμ§ νλ₯Ό λ³Ό μ μκΈ° λλ¬Έμ μ΄λ²€νΈ 루νκ° μ΄λ»κ² μλνλμ§ μ μΆν΄μΌ ν©λλ€.
λ€μμ μ΄λ²€νΈ 루νλ₯Ό λ³΄λ€ μ μ΄ν΄νκΈ° μν΄ μ¬μν μ μλ μμ μ λλ€.
document.addEventListener('click', () => {
setTimeout(console.log.bind(console, 'third'), 0);
setTimeout(console.log.bind(console, 'fifth'), 100);
console.log('first');
});
document.addEventListener('click', () => {
setTimeout(console.log.bind(console, 'fourth'), 0);
console.log('second');
});