IT/JavaScript

[JavaScript] ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

zi0_0 2025. 2. 24. 01:08
๐Ÿ“Œ ์ถ”๊ฐ€๋กœ ์ •๋ฆฌํ•  ๊ฒƒ 
- ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
- call back
- promise

 

๋™๊ธฐ vs ๋น„๋™๊ธฐ 

JavaScript๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ (single thread) ์–ธ์–ด์ด๋ฉฐ, 
๋น„๋™๊ธฐ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ 

 

๊ฐœ๋…

  • ๋™๊ธฐ (Synchronous)
    • ํ•œ ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ 
    • ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ -> ์ค‘๊ฐ„์— ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๋ฉด, ๋‹ค์Œ ๋ถ€๋ถ„์ด ์•„์˜ˆ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์Œ 
console.log('1') // ๋ฐ”๋กœ ์ถœ๋ ฅ 
alert('์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.') // ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๋ฅผ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ 
console.log('2') // ์œ— ์ค„์ด ์‹คํ–‰ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ

 

  • ๋น„๋™๊ธฐ (Asynchronous)
    • ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ ๊ฐ€๋Šฅ 
    • ๋น ๋ฅธ ์‹คํ–‰ ์†๋„์™€ ์œ ์—ฐํ•œ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅ
    • ๋Œ€ํ‘œ์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—…
      • `setTimeout`,`setInterval` (์‹œ๊ฐ„ ์ง€์—ฐ)
      • `fetch API` (๋„คํŠธ์›Œํฌ ์š”์ฒญ) 
      • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ (ํด๋ฆญ, ํ‚ค ์ž…๋ ฅ ๋“ฑ)
      • `Promise`,`async`/`await` (๋น„๋™๊ธฐ ์ฝ”๋“œ ์ฒ˜๋ฆฌ)
console.log('1')

setTimeout(() => {
    console.log('2')
}, 2000)

console.log('3')

// ๊ฒฐ๊ณผ : 1 3 2

 

 

JavaScript์—์„œ ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  

  • ๋ฌธ์ œ์ 
    • ๋งŒ์•ฝ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€ ์ดํ›„ ์ฝ”๋“œ๊ฐ€ ๋ฉˆ์ถฐ๋ฒ„๋ฆผ

 

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (Callback)

๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ `์ธ์ž`๋กœ ์ „๋‹ฌ๋˜์–ด ํŠน์ • ์‹œ์ ์— ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘๊ณ , ํŠน์ • ์‹œ์ ์ด๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
  • ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰ํ•  ์ฝ”๋“œ (์ž‘์—…)๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•˜๋Š” ์—ญํ• 
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์‹œ์ ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Œ 
  • ์ฃผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ (์˜ˆ: API ํ˜ธ์ถœ, ํŒŒ์ผ ์ฝ๊ธฐ, ํƒ€์ด๋จธ)์—์„œ ์‚ฌ์šฉ๋จ 
// setTimeout() ์˜ˆ์ œ 
console.log("A");

setTimeout(function () {
    console.log("B");
}, 2000); // 2์ดˆ ํ›„ ์‹คํ–‰

console.log("C");

 

โ€ผ๏ธ ์ฝœ๋ฐฑ ์ง€์˜ฅ (Callback Hell) ๋ฌธ์ œ 

  • ์„ค๋ช…
    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋ ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ 
  • ๋ฌธ์ œ์ 
    • ์ฝ”๋“œ๊ฐ€ ์ค‘์ฒฉ๋ ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง
    • ๋””๋ฒ„๊น…๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ 
  • ํ˜„์žฌ
    • ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋น„๋™๊ธฐ API๋Š” ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ 
    • ๋Œ€์‹  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `Promise`์™€ `async`/`await`๊ฐ€ ๋“ฑ์žฅํ•จ 
// ์ฝœ๋ฐฑ ์ง€์˜ฅ ์˜ˆ์ œ 
function step1(callback) {
    setTimeout(() => {
        console.log("1๋‹จ๊ณ„ ์™„๋ฃŒ");
        callback();
    }, 1000);
}

function step2(callback) {
    setTimeout(() => {
        console.log("2๋‹จ๊ณ„ ์™„๋ฃŒ");
        callback();
    }, 1000);
}

function step3(callback) {
    setTimeout(() => {
        console.log("3๋‹จ๊ณ„ ์™„๋ฃŒ");
        callback();
    }, 1000);
}

// ์ฝœ๋ฐฑ ์ค‘์ฒฉ (์ฝœ๋ฐฑ ์ง€์˜ฅ ๋ฐœ์ƒ)
step1(() => {
    step2(() => {
        step3(() => {
            console.log("๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ!");
        });
    });
});

 

 

 

 

 

 

๐Ÿ“š ์ฝœ๋ฐฑ ํ•จ์ˆ˜(Callback) ๊ฐœ๋… & ์‘์šฉ - ์™„๋ฒฝ ์ •๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ž€? ์ฝœ๋ฐฑ(Callback) ํ•จ์ˆ˜๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์„œ ํ˜ธ์ถœ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด sayHello(

inpa.tistory.com

 

 

2๏ธโƒฃ Promise 

promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•  ๋•Œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ฃผ๊ฒ ๋‹ค๊ณ  '์•ฝ์†'ํ•˜๋Š” ๊ฐ์ฒด 
  • ์„ค๋ช…
    • ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์น˜ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ 
    • ๋‹ค๋งŒ, ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฏธ๋ž˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ๋‹ค๋Š” ํ”„๋กœ๋ฏธ์Šค (์•ฝ์†)์„ ๋ฐ˜ํ™˜
  • ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ 
    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ฝœ๋ฐฑ ์ง€์˜ฅ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•˜๊ธฐ๋„ ํ•จ. 
    • `promise`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ณ  ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ 
  • ์ƒํƒœ
    • ๋Œ€๊ธฐ (pending) : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ (์ดํ–‰ํ•˜์ง€๋„, ๊ฑฐ๋ถ€ํ•˜์ง€๋„ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ)
    • ์ดํ–‰ (fulfilled) : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ (์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ)
    • ๊ฑฐ๋ถ€ (rejected) : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ•œ ์ƒํƒœ (์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ)

 

๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ?
๋ณดํ†ต ๋น„๋™๊ธฐ ์ฝ”๋“œ (ex: setTimeout, fetch ๋“ฑ)๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•จ. ํ•˜์ง€๋งŒ, promise์˜ `then()`์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋จ 

 

Promise ์‚ฌ์šฉ๋ฒ• 

 

 

 

 

 

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise

 

Promise - JavaScript | MDN

Promise ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งž์ดํ•  ๋ฏธ๋ž˜์˜ ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ์™€ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

developer.mozilla.org

 

 

 

 

 

https://inpa.tistory.com/entry/%F0%9F%8C%90-js-async

 

๐ŸŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ '๋น„๋™๊ธฐ' ์™„๋ฒฝ ์ดํ•ด โ—

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”„

inpa.tistory.com

 

 

 

 

โš™๏ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋™์ž‘ ์›๋ฆฌ 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ๊ถ๊ธˆํ–ˆ๋Š”๋ฐ, ์นœ๊ตฌ์—๊ฒŒ ์˜์ƒ์„ ์ถ”์ฒœ๋ฐ›์•„ ์ดํ•ดํ•œ ๋ฐ”๋ฅผ ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. 
์•„๋ž˜์˜ ์˜์ƒ์„ ๋จผ์ € ํ•œ๋ฒˆ ๋ณด์‹œ๊ณ  ๊ธ€์„ ์ฝ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 

 

JavaScript Runtime (๋‹จ์ˆœํ™” ์˜ˆ์‹œ)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด์ง€๋งŒ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด
Web APIs, ์ด๋ฒคํŠธ ๋ฃจํ”„, ์ฝœ๋ฐฑ ํ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ™œ์šฉํ•จ 
    • ์‹คํ–‰ ์œ„์น˜?
      • Heap & Stack :JavaScript ์—”์ง„ ๋‚ด๋ถ€ (V8, SpiderMonkey ๋“ฑ)
      • Web APIs : ๋ธŒ๋ผ์šฐ์ € (๋˜๋Š” Node.js ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ)
      • Callback Queue & Event Loop : ๋ธŒ๋ผ์šฐ์ € (๋˜๋Š” Node.js ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ) 
webapis๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜๋Š” ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด!!!!!!!! ์ปดํ“จํŒ… ์ž์›์„ ์“ฐ๋Š”๊ฑฐ๋‹ค!!

  • heap (ํž™)
    • ์ฐธ์กฐ ์ž๋ฃŒํ˜• (object, array, function)๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„ 
    • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ (์ฐธ์กฐ๊ฐ’) ์ €์žฅ
  • stack (์Šคํƒ)
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (excution context)๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„ 
    • LIFO (last in, first out) ๊ตฌ์กฐ : ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด stack์— ์Œ“์ด๊ณ , ์‹คํ–‰์ด ๋๋‚˜๋ฉด ์ œ๊ฑฐ๋จ 
  • web apis (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์˜์—ญ)
    • setTimeout, DOM ์ด๋ฒคํŠธ, AJAX ์š”์ฒญ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ๊ณต๊ฐ„
    • ๋ธŒ๋ผ์šฐ์ €์—๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ๋”ฐ๋กœ ๋งˆ๋ จ๋˜์–ด ์žˆ์Œ
    • JavaScript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ, web apis๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ ํ›„ ๋Œ€๊ธฐ์‹œํ‚ด 
  • callback queue (์ฝœ๋ฐฑ ํ)
    • web apis์—์„œ ์™„๋ฃŒ๋œ ์ž‘์—…์ด ์ฝœ๋ฐฑ ํ๋กœ ์ด๋™
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๊ณต๊ฐ„
    • ํ•˜์ง€๋งŒ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , stack์ด ๋น„์—ˆ์„ ๋•Œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ํ•˜๋„๋ก ํ•จ
  • event loop (์ด๋ฒคํŠธ ๋ฃจํ”„)
    • stack์ด ๋น„์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋น„์—ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ฝœ๋ฐฑ ํ์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ 
    • javascript๊ฐ€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋งค์ปค๋‹ˆ์ฆ˜ 

 

the call stack

  • printsquare์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์œผ๋กœ ์Œ“์ด๊ณ  (printsqure > square ...),
  • ์‹คํ–‰๋˜๋Š” ์ˆœ์œผ๋กœ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค (multiply > square ...)

 

๋™์ž‘ ์ˆœ์„œ 

1. main() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰

2. console.log('hi') ์‹คํ–‰

  • ์ฝ˜์†”์— hi ์ถœ๋ ฅ
  • stack ๋น ์ ธ๋‚˜๊ฐ 

3. setTimeout(cb, 5000) ์‹คํ–‰

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜(cb)๋ฅผ web api์— ๋„˜๊น€
  • web api์—์„œ 5์ดˆ ํƒ€์ด๋จธ ์‹œ์ž‘
  • setTimeout ํ•จ์ˆ˜๋Š” ์‹คํ–‰์ด ๋๋‚˜๋ฏ€๋กœ stack์—์„œ ์ œ๊ฑฐ๋จ 

3๋ฒˆ ๊ณผ์ • ๊ทธ๋ฆผ

4.console.log('JSConfEU') ์‹คํ–‰

  • ์ฝ˜์†”์— JSConfEU ์ถœ๋ ฅ
  • stack ๋น ์ ธ๋‚˜๊ฐ

5. 5์ดˆ ํ›„, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (cb) ์‹คํ–‰ ์ค€๋น„

  • web api๋Š” cb๋ฅผ callback queue์— ๋„ฃ์Œ

5๋ฒˆ ๊ณผ์ • ์™„๋ฃŒ ํ›„

6. event loop๊ฐ€ callback queue๋ฅผ ํ™•์ธ

  • event loop๋Š” stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
  • stack์ด ๋น„์–ด ์žˆ์œผ๋ฉด callback queue์—์„œ cb๋ฅผ ๊บผ๋‚ด ์‹คํ–‰ 

6๋ฒˆ ๊ณผ์ • ์™„๋ฃŒ ํ›„

 

7. console.log('there') ์‹คํ–‰

  • cb๊ฐ€ stack์— ๋“ค์–ด๊ฐ€ ์‹คํ–‰๋จ
  • there๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ 

 

* ๋งŒ์•ฝ setTimeout์ด '0'์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉดโ“ 

setTimeout์ด 0์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ task queue๋กœ ๋„˜์–ด๊ฐ„ cb๋Š” stack์ด ๋น„์›Œ์ ธ์•ผ์ง€ ์‹คํ–‰๋จ
๋”ฐ๋ผ์„œ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ๊ด€๊ณ„์—†์ด ๊ฒฐ๊ณผ๋Š” 1, 3, 2๋กœ ์ถœ๋ ฅ
console.log('1')

setTimeout(function cb() {
    console.log('2')
}, 0)

console.log('3')
// ๊ฒฐ๊ณผ: 1, 3, 2

 

 

 

 

'IT > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์ด์ •๋ฆฌ  (0) 2025.02.23
Copy