event loop in javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 이벀트 루프

원문: Event loop in javascript

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ’‹μ•„ν•œλ‹€λ©΄ 이걸 λ°°μ›Œμ•Ό ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΉŠμ€ μΈ‘λ©΄ 쀑 ν•˜λ‚˜μΈ 이벀트 루프이닀. λ§Žμ€ κ°œλ°œμžλ“€μ΄ μˆ˜λ…„κ°„ μΌν•˜λ©΄μ„œλ„ μ—¬μ „νžˆ 이벀트 루프λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€. κ·ΈλŸ¬λ‚˜ 이 κ²Œμ‹œλ¬Όμ„ 톡해 이벀트 루프가 무엇인지, 그리고 μ‹€μ œλ‘œ κ·Έλ ‡κ²Œ λ³΅μž‘ν•˜μ§€λŠ” μ•Šλ‹€λŠ” 것을 μ•Œλ €μ£Όκ³  μ‹Άλ‹€.

크둬 V8엔진은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒ?

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” ν•œλ²ˆμ— ν•œμ€„ μ”© μ²˜λ¦¬λœλ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 단인 μŠ€λ ˆλ“œμž„μ„ μ˜λ―Έν•œλ‹€.

λ°˜ν™˜ν•˜λŠ”λ° μ •λ§λ‘œ 였랜 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 쀄은 κ·Έ 후에 μž‘μ„±λœ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 것을 λ§‰λŠ”λ‹€.

μ›Ή μ‚¬μ΄νŠΈμ—μ„œ λ²„νŠΌμ„ ν΄λ¦­ν–ˆλŠ”λ°, κ·Έλƒ₯ λ©ˆμΆ”λŠ” 경우λ₯Ό 상상해보라. λ‹€λ₯Έ λ²„νŠΌμ„ ν΄λ¦­ν•΄λ³΄μ§€λ§Œ 아무일도 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€. 버그가 μ—†λŠ” κ²ƒμœΌλ‘œ κ°€μ •ν–ˆμ„ λ•Œ, 이 ν˜„μƒμ˜ κ°€μž₯ 큰 원인은 λ²„νŠΌ 클릭으둜 μ‹€ν–‰λ˜λŠ” 일뢀 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ νŠΈλ¦¬κ±°λ˜μ§€λ§Œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” 것이닀.

콜 μŠ€νƒμ€ μ‡Όν•‘λ°±κ³Ό κ°™λ‹€. 쇼핑백에 넣은 첫번째 물건은 λ‚˜κ°ˆλ•ŒλŠ” 맨 λ§ˆμ§€λ§‰μ— λ‚˜κ°€κ²Œ λœλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λͺ¨λ“  라인을 콜 μŠ€νƒμ— μΆ”κ°€ν•˜μ—¬ LIFO(Last in First Out) λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•œλ‹€. μš”μ»¨λŒ€ μ½œμŠ€νƒμ€ μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž¨μ— μžˆλŠ” μœ„μΉ˜λ₯Ό κΈ°λ‘ν•˜κ³  μ‹λ³„ν•˜λŠ” 데이터 ꡬ쑰이닀.

κ·Έλ ‡λ‹€λ©΄ 엔진이 μ–΄λ–»κ²Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ 라인을 ν•œλ²ˆμ— ν•˜λ‚˜μ”© μ²˜λ¦¬ν• κΉŒ?

κ·Έ 닡은 콜 μŠ€νƒμ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

콜 μŠ€νƒμ„ μ—˜λ ˆλ² μ΄ν„°μ— νƒ€λŠ” 것이라고 μƒκ°ν•˜μž. μ—˜λ¦¬λ² μ΄ν„°μ— 첫번째둜 탄 μ‚¬λžŒμ€ μ—˜λ¦¬λ² μ΄ν„°μ—μ„œ 내린땐 λ§ˆμ§€λ§‰μœΌλ‘œ λ‚΄λ¦¬μ§€λ§Œ λ§ˆμ§€λ§‰μœΌλ‘œ 탄 μ‚¬λžŒμ€ 첫번째둜 λ‚΄λ¦°λ‹€.

예제λ₯Ό 보자.

var firstEventLoop = function () {
  console.log("Yo people i am first one!!");
};
var secondEventLoop = function () {
  firstEventLoop();
  console.log("Yo people i am second one!!");
};
secondEventLoop();

μœ„μ˜ μ˜ˆμ œκ°€ 콜 μŠ€νƒμ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ 보자. λ¨Όμ € 메인 ν•¨μˆ˜(읡λͺ… ν•¨μˆ˜)은 콜 μŠ€νƒμ— pushλ˜μ–΄ 진닀. (μ•„λž˜μ˜ 그림처럼)

κ·Έ λ‹€μŒ secondEventLoop ν•¨μˆ˜κ°€ μ‹€ν–‰ 될 것이닀. secondEventLoopκ°€ 호좜되면, μ½œμŠ€νƒμ€ μ•„λž˜μ²˜λŸΌ κ΅¬μ„±λ˜μ–΄μ§„λ‹€.

secondEventLoop 싀행은 firstEventLoop ν•¨μˆ˜μ˜ 싀행을 λ°œμƒμ‹œν‚€κ³ , firstEventLoop ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©΄ μ½œμŠ€νƒμ€ μ•„λž˜μ²˜λŸΌ κ΅¬μ„±λœλ‹€.

firstEventLoop ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©΄ μ½˜μ†” λ‘œκ·Έκ°€ μ°νžŒλ‹€.(console.log("Yo people i am first one!!");) 그럼 이제 firstEventLoop μ•ˆμ— 더 이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ firstEventLoop ν•¨μˆ˜λŠ” μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.

secondEventLoop ν•¨μˆ˜κ°€ κ³„μ†ν•΄μ„œ μ‹€ν–‰λ˜κ³ , secondEventLoop ν•¨μˆ˜μ˜ μ½˜μ†” λ‘œκ·Έκ°€ μ°νžŒλ‹€.(console.log("Yo people i am second one!!");) λ§ˆμ°¬κ°€μ§€λ‘œ 이제 더 이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ secondEventLoop ν•¨μˆ˜λŠ” μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 더 이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ 이 예제의 읡λͺ… ν•¨μˆ˜λŠ” μ½œμŠ€νƒμ—μ„œ μ‚¬λΌμ§ˆ 것이닀.

자 κ³„μ†ν•΄μ„œ μ•Œμ•„κ°€λ³΄μž.

μš°λ¦¬λŠ” setTimeout ν•¨μˆ˜μ— μ΅μˆ™ν•˜λ‹€. setTimeout ν•¨μˆ˜μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λŠ” 비동기 콜백 ν•¨μˆ˜μ΄λ‹€.

μ•„λž˜μ˜ 예λ₯Ό 보자.

function printMe1 () {
  console.log("Hello Javascript");
};
function printMe2(){
  setTimeout(
    printMe1(),
    2000
  );
  console.log("Hey I am the first to be printed");
}
printMe2();

μœ„μ˜ 예제λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ½˜μ†”μ— "Hey I am the first to be printed" λ¬Έμžμ—΄μ΄ λ¨Όμ € 찍힐 것이고, κ·Έ λ‹€μŒμ— " Hello Javascript"κ°€ 찍힐 것이닀.

이제 μœ„μ˜ μ½”λ“œμ—μ„œ 콜 μŠ€νƒμ—μ„œ 진행쀑인 μž‘μ—…μ„ 확인해보겠닀.

printMe1을 콜백 ν•¨μˆ˜λ‘œ κ°€μ§€λŠ” setTimeout ν›„ λ°œμƒν•  일듀은 μ½œμŠ€νƒ μ•ˆμ— μžˆλ‹€. printMe1 ν•¨μˆ˜κ°€ μ¦‰μ‹œ μ‹€ν–‰λ˜μ§€ μ•Šκ³  2 초 후에 μ‹€ν–‰λ˜λ―€λ‘œ, printMe1 ν•¨μˆ˜λŠ” 호좜 μŠ€νƒμ— ν‘Έμ‹œ ν•  수 μ—†λ‹€. λ”°λΌμ„œ 호좜 μŠ€νƒμ—μ„œ 사라진닀.

μ½œμŠ€νƒμ€ μ•„λž˜μ™€ κ°™μ•„μ§ˆ 것이닀.:

printMe2()κ°€ κ³„μ†ν•΄μ„œ μ‹€ν–‰ 될 것이며 μ½˜μ†”μ— λ¬Έμžμ—΄μ΄ 좜λ ₯되고 μ½œμŠ€νƒμ—μ„œ 제거 될 것이닀. 이제 더 이상 μ½œμŠ€νƒ μ•ˆμ— μ‹€ν–‰ν•  ν•­λͺ©μ΄ γ…‡μ—†κΈ° λ•Œλ¬Έμ— 읡λͺ…ν•¨μˆ˜λ„ μ½œμŠ€νƒμ—μ„œ μ‚¬λΌμ§ˆ 것이닀.

λ”°λΌμ„œ μ½œμŠ€νƒμ€ μ•„λž˜μ™€ 처럼 빈 μƒνƒœκ°€ λœλ‹€.:

2초 λ’€ λ§ˆλ²•μ²˜λŸΌ printMe2 ν•¨μˆ˜κ°€ μ½œμŠ€νƒμ— λ‚˜νƒ€λ‚  것이닀.

printMe2 ν•¨μˆ˜λŠ” "Hello javascript" λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•œλ‹€. μ•„λ§ˆλ„ μ–΄λ–»κ²Œ μ΄λ ‡κ²Œ λ™μž‘λ˜λŠ”μ§€ λ†€λž„μ§€λ„ λͺ¨λ₯Έλ‹€. μ—¬κΈ°μ„œ 이벀트 λ£¨ν”„μ˜ λ™μ‹œμ„±(concurrency)이 λ“œλŸ¬λ‚œλ‹€.

μš°λ¦¬λŠ” 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ΄ ν•œ λ²ˆμ— ν•œ 가지 일을 ν•  수 μžˆλ‹€κ³  λ…Όμ˜ν–ˆμ§€λ§Œ, μ§€κΈˆμ€ λ™μ‹œμ„±μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ€ ν•œ λ²ˆμ— ν•œ κ°€μ§€λ§Œ ν•  수 있고, λ‹€λ₯Έ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆμ—λŠ” Ajax ν˜ΈμΆœμ„ ν•  수 μ—†μœΌλ©°, λ‹€λ₯Έ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆμ—λŠ” setTimeout ν•  수 μ—†μ§€λ§Œ λΈŒλΌμš°μ €λ₯Ό 톡해 이 λͺ¨λ“  것을 ν•  수 μžˆλ‹€. λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ Ajax ν˜ΈμΆœμ„ ν•  수 있으며 λ‹€λ₯Έ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ setTimeout을 ν•  μˆ˜λ„ μžˆλ‹€.

setTimeout을 ν•˜κ³  Ajax μš”μ²­μ„ ν•˜λŠ” 것은 Javascript λŸ°νƒ€μž„μ— μžˆλŠ” 것이 μ•„λ‹ˆλΌ λΈŒλΌμš°μ €κ°€ μ›Ή API둜 μ²˜λ¦¬ν•œλ‹€. λΈŒλΌμš°μ €λŠ” μ΄λŸ¬ν•œ κ²ƒλ“€μ˜ μ²˜λ¦¬κ³Όμ •μ— λŒ€ν•΄ μ•Œκ³  있으며 κ·Έκ²ƒμ˜ 콜백 ν•¨μˆ˜λ₯Ό 톡해 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

이벀트 λ£¨ν”„λŠ” λͺ¨λ“  μš”μ²­λ§ˆλ‹€ μƒˆ μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜λŠ” μŠ€λ ˆλ“œ λͺ¨λΈκ³Ό 달리 단일 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

μ„œλ‘œλ‹€λ₯Έ 일듀이 같은 μ“°λ ˆλ“œμ—μ„œ μΌμ–΄λ‚˜κ³  있기 λ•Œλ¬Έμ— 차단할 수 μ—†λ‹€. 이것은 λͺ¨λ“  μ“°λ ˆλ“œλ₯Ό 차단할 수 있기 λ•Œλ¬Έμ— μ–΄λ–€ 일이 μΌμ–΄λ‚˜κΈ°λ₯Ό 기닀릴 수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λŒ€μ‹  μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ ν˜ΈμΆœλ˜λŠ” μ½œλ°±μ„ μ •μ˜ν•˜λ©΄ λœλ‹€. 이λ₯Ό 보톡 non-blocking I/O라고 ν•œλ‹€.

blocking I/O에 λŒ€ν•œ 예:

row = db_query(β€˜SELECT * FROM users’);

print(row);

print(β€˜It will print after user result print’);

μœ„μ˜ μ½”λ“œμ—μ„œ 싀행은 db 쿼리의 κ²°κ³Όλ₯Ό λ°˜ν™˜ν• λ•Œ λ•ŒκΉŒμ§€(row) μΌμ‹œ μ€‘μ§€λ˜κ³  κ·Έ λ‹€μŒ κ²°κ³Όκ°€ λ°˜ν™˜λ˜λ©΄ λ‚˜λ¨Έμ§€ μ½”λ“œκ°€ μ‹€ν•΄λœλ‹€. λ”°λΌμ„œ λ¨Όμ € row을 좜λ ₯ν•œ λ‹€μŒ(μ‚¬μš©μž 질의 κ²°κ³Ό) β€˜It will print after user result print' λ¬Έμžμ—΄μ„ 좜λ ₯ν•œλ‹€.

이제 같은 μ˜ˆμ‹œμ§€λ§Œ μ•½κ°„μ˜ λ³€ν™”λ₯Ό λ³Ό 수 μžˆλ‹€. non-blocking I/O에 λŒ€ν•œ 예:

db_query(β€˜SELECT * FROM users’, function (row) {

  print(row);

});

print(β€˜It will print after user result print’);

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 항상 Javascriptμ—μ„œ μ‚¬μš©ν–ˆλ˜ 것과 같은 읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. JSλŠ” 이벀트λ₯Ό 많이 ν™œμš©ν•˜λŠ”λ°, 그것이 λ°”λ‘œ μ½œλ°±μ— κ΄€ν•œ 것이닀. μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ μ½œλ°±μ„ νŠΈλ¦¬κ±°ν•˜λŠ” μ΄λ²€νŠΈκ°€ μ‹€ν–‰λœλ‹€. 이것이 μ’…μ’… 이벀트 λͺ¨λΈ λ˜λŠ” 비동기 λͺ¨λΈμ΄λΌκ³ λ„ν•˜λŠ” μ΄μœ μ΄λ‹€. λ”°λΌμ„œ μœ„ 예의 μ‹€ν–‰κ²°κ³ΌλŠ” 쿼리 κ²°κ³Όλ₯Ό 기닀리지 μ•Šκ³  쿼리λ₯Ό μ‹€ν–‰ν•˜κ³  λ‹€λ₯Έ μ½”λ“œ 라인을 κ³„μ†ν•©λ‹ˆλ‹€. 일단 κ²°κ³Όκ°€ μΏΌλ¦¬μ—μ„œ μƒμ„±λ˜λ©΄ 콜백 및 좜λ ₯λœλ‹€. λ¨Όμ € β€˜It will print after user result print’ λ¬Έμžμ—΄μ΄ 좜λ ₯된 λ‹€μŒ 행을 좜λ ₯ν•œλ‹€(μ‚¬μš©μž 질의 κ²°κ³Ό).

이 λͺ¨λΈμ˜ κ΅¬ν˜„μ€ μ΄λŸ¬ν•œ 이벀트λ₯Ό μ²˜λ¦¬ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 루프λ₯Ό μ‚¬μš©ν•œλ‹€. κ·Έλž˜μ„œ 이벀트 νλ‚˜ 이벀트 루프라고 λΆˆλ¦°λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 이벀트 루프(Javascript Event Loop)에 λŒ€ν•΄ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

이전 예제둜 μ–΄λ–»κ²Œ μž‘μš©ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

이전에 μš°λ¦¬λŠ” setTimeout ν•¨μˆ˜κ°€ 콜백 ν•¨μˆ˜μΈ printMe1을 μ‚¬μš©ν•˜μ—¬ 콜 μŠ€νƒμ„ λ°€μ–΄λ„£μœΌλ©΄ 콜 μŠ€νƒμ—μ„œ 사라짐을 λ³΄μ•˜λ‹€. setTimeout이 μ‹€ν–‰λ˜λ©΄ λΈŒλΌμš°μ €κ°€ setTimeout의 콜백 κΈ°λŠ₯을 이벀트 ν…Œμ΄λΈ”μ— λ°°μΉ˜ν•œλ‹€. 그것은 μ›Ή API이기 λ•Œλ¬Έμ— ν˜„μž¬μ˜ javascript λŸ°νƒ€μž„κ³ΌλŠ” 아무 상관이 μ—†λ‹€. 이벀트 ν…Œμ΄λΈ”λ‘œ μ „λ‹¬ν•˜μ—¬ 이 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³  νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ μ‹€ν–‰ν•œλ‹€. (이 경우 2초 ν›„)

μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ 이벀트 ν…Œμ΄λΈ”μ΄ λ©”μ‹œμ§€ λŒ€κΈ°μ—΄ ν…Œμ΄λΈ”(콜백 λŒ€κΈ°μ—΄ ν…Œμ΄λΈ”)둜 ν•¨μˆ˜λ₯Ό μ΄λ™μ‹œν‚¨λ‹€. setTimeout κΈ°λŠ₯이 μ‹€ν–‰λœ ν›„ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ λ΄…μ‹œλ‹€.

setTimeout ν•¨μˆ˜κ°€ μ‹€ν–‰λœ 후에 μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

콜백 ν•¨μˆ˜(printMe1())λ₯Ό 이벀트 ν…Œμ΄λΈ”λ‘œ μ΄λ™ν•˜λ©΄ 콜 μŠ€νƒμ—μ„œ μ°¨λ‹¨λ˜λŠ” 것이 μ—†μŒμ„ μ•Œ 수 μžˆλ‹€. λΈŒλΌμš°μ €λŠ” 2초 λ™μ•ˆ 기닀리지 μ•Šκ³  콜 μŠ€νƒμ—μ„œ 싀행을 κ³„μ†ν•œλ‹€. λ‹€μŒ μ‹€ν–‰ μ½”λ“œλŠ” myFunction이고 myFunction이 ν˜ΈμΆœλ˜μ–΄ μ½˜μ†”μ—μ„œ "It's my function"을 좜λ ₯ν•˜κ³  콜 μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€. λ”°λΌμ„œ 콜 μŠ€νƒμ—λŠ” 더 이상 μ‹€ν–‰ν•  행이 μ—†μœΌλ―€λ‘œ 읡λͺ… ν•¨μˆ˜λ„ 콜 μŠ€νƒμ—μ„œ 제거되고 콜 μŠ€νƒμ€ λΉ„κ²Œλœλ‹€.

이벀트 ν…Œμ΄λΈ”μ€ μ΄λ²€νŠΈκ°€ νŠΈλ¦¬κ±°λ˜λŠ”μ§€ μ—¬λΆ€λ₯Ό μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•œλ‹€. λ§Œμ•½ 트리거 된 경우 ν•΄λ‹Ή ν•¨μˆ˜λŠ” λ©”μ‹œμ§€ λŒ€κΈ°μ—΄ λ˜λŠ” 호좜 λŒ€κΈ°μ—΄λ‘œ μ΄λ™ν•œλ‹€. 우리의 예제인 경우, 2초 ν›„μ—”, printMe1 ν•¨μˆ˜κ°€ νŠΈλ¦¬κ±°λ˜μ–΄ λ©”μ‹œμ§€ λŒ€κΈ°μ—΄λ‘œ μ΄λ™ν•œλ‹€.

2초 ν›„:

printMe1() ν•¨μˆ˜κ°€ 이벀트 ν…Œμ΄λΈ”μ—μ„œ λ©”μ‹œμ§€ 큐둜 μ΄λ™λœλ‹€.

콜 μŠ€νƒμ΄ λΉ„μ–΄ μžˆλŠ”μ§€ μ§€μ†μ μœΌλ‘œ ν™•μΈν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜μ΄λ‹€. 콜 μŠ€νƒμ΄ λΉ„μ–΄ 있으면 호좜 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. 우리의 예제인 경우 λ©”μ‹œμ§€ λŒ€κΈ°μ—΄ ν…Œμ΄λΈ”μ˜ 첫 번째 ν•¨μˆ˜κ°€ 호좜 μŠ€νƒμœΌλ‘œ μ΄λ™ν•˜κ³  호좜 μŠ€νƒμ—μ„œ μ‹€ν–‰λœλ‹€.

이 λͺ¨λ“  과정은 EVENT LOOP으둜 λΆˆλ¦°λ‹€.

μœ„μ˜ μ˜ˆμ—μ„œ μš°λ¦¬λŠ” printMe1 ν•¨μˆ˜κ°€ 호좜 μŠ€νƒμœΌλ‘œ μ΄λ™ν•˜μ—¬ μ‹€ν–‰λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. μ½˜μ†”μ— Hello javascriptβ€™λΌλŠ” κΈ€μžκ°€ 좜λ ₯된 것을 λ³Ό 수 μžˆλ‹€.

λŠλ‚€μ 

⚠️ **GitHub.com Fallback** ⚠️