Scheduling: setTimeout and setInterval - Lee-hyuna/33-js-concepts-kr GitHub Wiki

์Šค์ผ€์ฅด๋ง: setTimeout and setInterval

๋ฒˆ์—ญ : https://javascript.info/settimeout-setinterval#canceling-with-cleartimeout

์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๊ธธ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ "scheduling a call" ์ด๋ผ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‘๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • setTimeout ์ด๊ฒƒ์€ ํŠน์ •์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ํ›„์— ํ•œ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • setInterval ์ด๊ฒƒ์€ ํŠน์ •์‹œ๊ฐ„ ๊ฐ„๊ฒฉ๋™์•ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ •ํ•ญ๋ชฉ์˜ ํ•œ ํŒŒํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ํ™˜๊ฒฝ๋“ค์€ ๋‚ด๋ถ€์ ์ธ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ๋‚˜ ์ด๋“ค์€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ง€์›์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout

๋ฌธ๋ฒ•

let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)

ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค:

func|code

ํ•จ์ˆ˜ ๋˜๋Š” ์ฝ”๋“œ๋ญ‰์น˜๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ฒŒ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์ธ ์ด์œ ๋กœ ์ธํ•ด ์ผ๋ จ์˜ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

delay

๋™์ž‘ํ•˜๊ธฐ ์ „ ๋”œ๋ ˆ์ด ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋‹จ์œ„๋Š” ๋ฐ€๋ฆฌ์„ธ์ปจ๋“œ(1000ms = 1 ์ดˆ), ๋””ํดํŠธ๋Š” 0

arg1, arg2โ€ฆ

ํ•จ์ˆ˜์— ์ „๋‹ฌ๋  ์ธ์ž๋“ค ( IE9 ๋Š” ์ง€์›์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ) ์˜ˆ๋ฅผ ๋“ค๋ฉด sayHi() ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ 1์ดˆ ๋’ค์— ํ˜ธ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function sayHi() {
  alert('Hello');
}

setTimeout(sayHi, 1000);

์ธ์ž๋“ค๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ ค๋ฉด

function sayHi(phrase, who) {
  alert( phrase + ', ' + who );
}

setTimeout(sayHi, 1000, "Hello", "John"); // Hello, John

๋งŒ์•ฝ์— ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฌธ์ž์—ด์„ ๋„˜๊ธด๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout("alert('Hello')", 1000);

ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ๋Œ€์‹ ์— ์•„๋ž˜์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์š”.

setTimeout(() => alert('Hello'), 1000);

์ดˆ๋ณด์ž ๊ฐœ๋ฐœ์ž๋“ค์ด ๋•Œ๋•Œ๋กœ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒผ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ• ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋ฉด์„œ ๊ด„ํ˜ธ() ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

// wrong!
setTimeout(sayHi(), 1000);

์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. setTimeout์€ ํ•จ์ˆ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ธฐ๋Œ€ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„  sayHi()๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ setTimeout์˜ ์ธ์ž๋กœ ๋„˜๊น๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” sayHi()๋Š” undefined(ํ•จ์ˆ˜๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜๋‹ค.) ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ์•„๋ฌด๊ฒƒ๋„ ์Šค์ผ€์ฅด๋ง ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Canceling with clearTimeout

setTimeout์€ "timer identifier" ๋ผ๋Š” ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด timerId๋Š” ์‹คํ–‰์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ทจ์†Œ ๋ฌธ๋ฒ•:

let timerId = setTimeout(...);
clearTimeout(timerId);

์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด, ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜ํ•˜๋‚˜๋ฅผ ์Šค์ผ€์ฅด ํ–ˆ๊ณ  ๊ทธ ํ›„์— ์ทจ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.(๋งˆ์Œ์ด ๋ฐ”๋€Œ์–ด์„œ) ๊ทธ ๊ฒฐ๊ณผ ์•„๋ฌด์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

let timerId = setTimeout(() => alert("never happens"), 1000);
alert(timerId); // timer identifier

clearTimeout(timerId);
alert(timerId); // same identifier (doesn't become null after canceling)

์šฐ๋ฆฌ๋Š” alert์˜ output์œผ๋กœ๋ถ€ํ„ฐ ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € timer identifier๋Š” ์ˆซ์ž ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋„ ์ด๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€ ๋ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด Node.js์—์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€๋‹Œ timer ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ๋งํ•ด ์ด ๋ฉ”์„œ๋“œ๋“ค์€ ์œ ๋‹ˆ๋ฒ„์…œํ•œ ๋ช…์„ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋“ค์€ timer๋“ค์„ HTML5 ํ‘œ์ค€์˜ timers section์—์„œ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

setInterval

setInterval ๋ฉ”์„œ๋“œ๋Š” setItmeout๊ณผ ๋™์ผํ•œ ๋ฌธ๋ฒ•์„ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)

๋ชจ๋“  ์ธ์ž๊ฐ’๋“ค์€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ setTimeout๊ณผ๋ฅธ ๋‹ค๋ฅด๊ฒŒ ๊ทธ๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ๋งŒ ๋™์ž‘์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ์ด ์ฃผ์–ด์ง€๋ฉด ๊ทœ์น™์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ํ˜ธ์ถœ์„ ๋ง‰์œผ๋ ค๋ฉด, ์šฐ๋ฆฐ clearInterval(timerId)๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—๋Š” ๋งค 2์ดˆ๋งˆ๋‹ค ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ ์ž…๋‹ˆ๋‹ค. 5์ดˆ ํ›„์—” output์ด ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

// repeat with the interval of 2 seconds
let timerId = setInterval(() => alert('tick'), 2000);

// after 5 seconds stop
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);

๊ฒฝ๊ณ  ์ฐฝ์ด ๋ณด์—ฌ์ง€๋Š” ๋™์•ˆ์—๋„ ์‹œ๊ฐ„์€ ๊ฐ‘๋‹ˆ๋‹ค.

ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ alert/confirm/prompt๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ๋™์•ˆ ๋‚ด๋ถ€์ ์ธ timer ๊ฐ€ ๊ณ„์† "๋˜‘๋”ฑ"(์ง„ํ–‰๋œ๋‹ค) ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ ๋‚˜์„œ ๋ช‡๋ช‡์‹œ๊ฐ„ ๋™์•ˆ alert์ฐฝ์„ ๋‹ซ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹ค์Œ ํ–‰์œ„๋ฅผ ํ•˜์ž๋งˆ์ž alert์ฐฝ์„ ์ฆ‰์‹œ ๋ณด์—ฌ์ค„๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ alert๋“ค์˜ ์‚ฌ์ด ๊ฐ„๊ฒฉ์€ 5์ดˆ ๋ณด๋‹ค๋„ ๋” ์งง์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Recursive setTimeout

๊ทœ์น™์ ์œผ๋กœ ๋ญ”๊ฐ€๋ฅผ ์‹คํ–‰์˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

setInterval์ด ํ•œ๊ฐ€์ง€์ด๊ณ  ๋‹ค๋ฅธ ํ•œ๊ฐ€์ง€๋Š” ์žฌ๊ท€์ ์ธ setTimeout์ž…๋‹ˆ๋‹ค.

/** instead of:
let timerId = setInterval(() => alert('tick'), 2000);
*/

let timerId = setTimeout(function tick() {
  alert('tick');
  timerId = setTimeout(tick, 2000); // (*)
}, 2000);

setTimeout์€ (*) ์ด ๋ถ€๋ถ„์—์„œ๋Š” ํ˜„์žฌ ํ˜ธ์ถœ์˜ ๋์—์„œ ๋ฐ”๋กœ ๋‹ค์Œ ํ˜ธ์ถœ์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

์žฌ๊ท€์ ์ธ setTimeout์€ setInterval ๋ณด๋‹ค ์ข€ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋‹ค์Œ ํ˜ธ์ถœ์ด ํ˜„์žฌ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์Šค์ผ€์ค„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋งค 5์ดˆ๋งˆ๋‹ค ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ด ๊ฐ„๊ฒฉ์„ 10, 20, 40์ดˆ๋กœ ๋Š˜๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์ˆ˜๋„ ์ฝ”๋“œ๋ฅผ ๋ณด์‹ญ์‹œ์š”

let delay = 5000;

let timerId = setTimeout(function request() {
  ...send request...

  if (request failed due to server overload) {
    // increase the interval to the next run
    delay *= 2;
  }

  timerId = setTimeout(request, delay);

}, delay);

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ณ„ํšํ•˜๊ณ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด CPU ์‚ฌ์šฉ์ด ๋งŽ์€ ๊ฒฝ์šฐ, ์‹คํ–‰์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ  ์กฐ๋งŒ๊ฐ„ ๋‹ค์Œ ํ˜ธ์ถœ์„ ๊ณ„ํš ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ๊ท€์ ์ธ setTimeout ์€ ์‹คํ–‰ ์‚ฌ์ด์˜ ์ง€์—ฐ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, setInterval์€ ๊ทธ๋ ‡์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‘๊ฐ€์ง€์˜ ์ฝ”๋“œ ์กฐ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” setInterval ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.

let i = 1;
setInterval(function() {
  func(i);
}, 100);

๋‘๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” ์žฌ๊ท€์ ์ธ setTimeout ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.

let i = 1;
setTimeout(function run() {
  func(i);
  setTimeout(run, 100);
}, 100);

setInterval์˜ ๋‚ด๋ถ€์ ์ธ ์Šค์ผ€์ฅด๋ง์€ func(i)๋ฅผ ๋งค 100ms ๋งˆ๋‹ค ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. https://javascript.info/article/settimeout-setinterval/setinterval-interval.png

๋ณด์ด์‹œ๋‚˜์š”? setInterval๋กœ ํ•จ์ˆ˜ func() ํ˜ธ์ถœ๋˜๋Š” ์‹ค์ œ ๋”œ๋ ˆ์ด๊ฐ„๊ฒฉ์€ ์ฝ”๋“œ์ƒ์—์„œ ๋ณด๋Š”๊ฑฐ๋ณด๋‹ค ํ›จ์”ฌ ๋œํ•˜๋‹ค. func์˜ ์‹คํ–‰๋„ interval์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ ์‹œ๊ฐ„์ด ์†Œ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๊ฒƒ์€ func์˜ ์‹คํ–‰์ด ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๊ณ  ์ฃผ์–ด์ง„ 100ms ์ดˆ๋ณด๋‹ค ๋” ๊ธธ์–ด์งˆ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์—”์ง„์€ func์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ์ฆ‰์‹œ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ฌธ ๊ฒฝ์šฐ๋กœ, ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ ์ง€์—ฐ ms๋ณด๋‹ค ์˜ค๋ž˜ ์‹คํ–‰๋˜๋ฉด ํ˜ธ์ถœ์€ ์ผ์‹œ ์ค‘์ง€์—†์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์žฌ๊ท€์ ์ธ setTimeout ์˜ ๊ทธ๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://javascript.info/article/settimeout-setinterval/settimeout-interval.png

์žฌ๊ท€ setTimeout์€ ๊ณ ์ • ์ง€์—ฐ (์—ฌ๊ธฐ์„œ๋Š” 100ms)์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ฝœ์€ ์ด์ „์˜ ์ž‘์—…์ด ๋๋‚˜๊ณ  ๊ณ„ํš๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Garbage collection

ํ•จ์ˆ˜๋ฅผ setInterval/setTimeout์— ๋„˜๊ธธ๋•Œ, ๋‚ด๋ถ€ ์ฐธ์กฐ๊ฐ€ ํ•จ์ˆ˜์•ˆ์— ์ƒ๊ฒจ๋‚˜๊ณ  ์Šค์ผ€์ฅด๋Ÿฌ ์•ˆ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ garbage collected ๋กœ ๋ถ€ํ„ฐ ํ•จ์ˆ˜๋ฅผ ์ง€์ผœ๋‚ด๋Š”๋ฐ ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

// the function stays in memory until the scheduler calls it
setTimeout(function() {...}, 100);

setInterval์˜ ๊ฒฝ์šฐ์—๋Š” clearInterval์ด ํ˜ธ์ถœ ๋ ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ lexical ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ํ•จ์ˆ˜๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ, ์™ธ๋ถ€ ๋ณ€์ˆ˜๋“ค ๋˜ํ•œ ์‚ด์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ํ•จ์ˆ˜ ์ž์ฒด๋ณด๋‹ค ๋”๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋”์ด์ƒ ํ•จ์ˆ˜ ์Šค์ผ€์ฅด๋ง์ด ํ•„์š”์—†์„ ๋•Œ์—๋Š” ์ทจ์†Œํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž‘์€ ํ•จ์ˆ˜๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค.

setTimeout(...,0)

์—ฌ๊ธฐ ์•„์ฃผ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.: setTimeout(func, 0), ๋˜๋Š” setTimeout(func).

์ด func ์˜ ์‹คํ–‰ ์Šค์ผ€์ฅด์€ ๊ณง ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šค์ผ€์ฅด๋Ÿฌ๋Š” ์˜ค์ง ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ๋‹ค ์™„๋ฃŒ ๋œ ์ดํ›„์— ์‹คํ–‰์„ ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ๋‹ค ์‹คํ–‰๋œ ์ดํ›„์— ๋™์ž‘ํ•˜๋ผ๊ณ  ์Šค์ผ€์ฅด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋น„๋™๊ธฐ์  ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์ด ๊ฒฐ๊ณผ๋Š” "Hello" ๋‚˜์˜ค๊ณ ๋‚˜์„œ ์ฆ‰์‹œ "World"๊ฐ€ ๋‚˜์˜ฌ๊ฒ๋‹ˆ๋‹ค.

setTimeout(() => alert("World"));

alert("Hello");

์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์€ "0ms ํ›„์— ํ•ด๋‹น ์‹คํ–‰์„ ์บ˜๋ฆฐ๋”์— ๋„ฃ์Šต๋‹ˆ๋‹ค." ๊ทธ๋Ÿฌ๋‚˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ๋งŒ โ€‹โ€‹"์บ˜๋ฆฐ๋”๋ฅผ ํ™•์ธ"ํ•˜๋ฏ€๋กœ "Hello"๊ฐ€ ๋จผ์ €์˜ค๊ณ  "World"๊ฐ€ ๋’ค์—์˜ต๋‹ˆ๋‹ค.

Splitting CPU-hungry task

์—ฌ๊ธฐ CPU-hungry(cpu ์ž์›์„ ๋งŽ์ด ๋จน๋Š”) ์ˆ˜ํ–‰์„ setTimeout์„ ์‚ฌ์šฉํ•ด์„œ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ์Šคํฌ๋ฆฝํŠธ (์ด ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ƒ‰์น ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)๋Š” CPU๊ฐ€ ๋งŽ์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋งŽ์€ ์ƒ‰์ƒ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ "๋ฉˆ์ถ”๋Š”"๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ธด ํ…์ŠคํŠธ๋ฅผ ์กฐ๊ฐ๋“ค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ 100 ๋ผ์ธ์„ ์ž‘์„ฑํ•œ ๋‹ค์ŒsetTimeout (..., 0)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋˜ ๋‹ค๋ฅธ 100 ๋ผ์ธ์„ ๊ณ„ํšํ•˜์‹ญ์‹œ์˜ค.

๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. '1'์—์„œ '1000000000'๊นŒ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ํ•˜๋ฉด CPU๊ฐ€ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ˆˆ์— ๋„๋Š” ์„œ๋ฒ„ ์ธก JS์˜ ๊ฒฝ์šฐ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚จํ›„์— ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ๋ฒ„ํŠผ์„ ํด๋ฆญ์„ ์‹œ๋„ํ•ด๋ด๋ผ. ์ „์ฒด JavaScript๊ฐ€ ์‹ค์ œ๋กœ ์ผ์‹œ ์ค‘์ง€ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

let i = 0;

let start = Date.now();

function count() {

  // do a heavy job
  for (let j = 0; j < 1e9; j++) {
    i++;
  }

  alert("Done in " + (Date.now() - start) + 'ms');
}

count();

๋ธŒ๋ผ์šฐ์ €๋Š” "์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค"๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ์ˆซ์ž๊ฐ€ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ค‘์ฒฉ ๋œ setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„ํ• ํ•ฉ์‹œ๋‹ค.

let i = 0;

let start = Date.now();

function count() {

  // do a piece of the heavy job (*)
  do {
    i++;
  } while (i % 1e6 != 0);

  if (i == 1e9) {
    alert("Done in " + (Date.now() - start) + 'ms');
  } else {
    setTimeout(count); // schedule the new call (**)
  }

}

count();

์ด์ œ ๋ธŒ๋ผ์šฐ์ € UI๋Š” "๊ณ„์‚ฐ ์ค‘"ํ”„๋กœ์„ธ์Šค์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

(*) ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์˜ ๋™์ž‘์„ ๋ณด์ž:

  1. ์ฒ˜์Œ ๋™์ž‘ : i=1...1000000.
  2. ๋‘๋ฒˆ์งธ ๋™์ž‘ : i=1000001..2000000
  3. ๊ทธ๋ฆฌ๊ณค ๊ณ„์†.., while์€ i๊ฐ€ 1000000์œผ๋กœ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํ• ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

(**) ํ‘œ์‹œ ๋œ ๊ณณ์—์„œ ์•„์ง ์ž‘์—…์ด ์™„๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹ค์Œ ํ˜ธ์ถœ์„ ์Šค์ผ€์ฅด๋ง์„ ํ•ฉ๋‹ˆ๋‹ค.

์นด์šดํŠธ ์‹คํ–‰ ์‚ฌ์ด์˜ ์ผ์‹œ ์ค‘์ง€๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ž‘์—…์— ๋ฐ˜์‘ ํ•  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํ•œ "ํ˜ธํก"์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์€ setTimeout์œผ๋กœ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๊ฑฐ๋‚˜ ๋ถ„ํ• ํ•˜์ง€ ์•Š์€ ๋‘ ๊ฐ€์ง€ ์ƒํ™ฉ ๋ชจ๋‘ ์†๋„๊ฐ€ ๋น„์Šทํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ณ„์‚ฐ ์‹œ๊ฐ„์—๋Š” ๋ณ„๋‹ค๋ฅธ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์„ ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, ๊ฐœ์„ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

count ()์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ์Šค์ผ€์ฅด๋ง์œผ๋กœ ์ด๋™์‹œํ‚ค๊ฒ ์Šต๋‹ˆ๋‹ค.

let i = 0;

let start = Date.now();

function count() {

  // move the scheduling at the beginning
  if (i < 1e9 - 1e6) {
    setTimeout(count); // schedule the new call
  }

  do {
    i++;
  } while (i % 1e6 != 0);

  if (i == 1e9) {
    alert("Done in " + (Date.now() - start) + 'ms');
  }

}

count();

์ด์ œ ์šฐ๋ฆฌ๊ฐ€count ()๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋” ๋งŽ์€ ๊ฒƒ์„ count () ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ฒŒ๋˜๋ฉด, ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ฆ‰์‹œ ๊ทธ๊ฒƒ์„ ๊ณ„ํšํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ํ•˜๋ฉด ํ›จ์”ฌ ์ ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ๋œ ํƒ€์ด๋จธ์˜ ๋ธŒ๋ผ์šฐ์ € ์ง€์—ฐ ์ตœ์†Œํ™”

๋ธŒ๋ผ์šฐ์ €์—๋Š” ์ค‘์ฒฉ ํƒ€์ด๋จธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๋นˆ๋„์˜ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. HTML5 ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด "5 ๊ฐœ์˜ ์ค‘์ฒฉ ๋œ ํƒ€์ด๋จธ ์ดํ›„์— ๊ฐ„๊ฒฉ์€ ์ตœ์†Œ 4 ๋ฐ€๋ฆฌ ์ดˆ๊ฐ€๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค."

์•„๋ž˜ ์˜ˆ๋ฅผ ํ†ตํ•ด ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ setTimeout ํ˜ธ์ถœ์€ 0ms ํ›„์— ์Šค์Šค๋กœ๋ฅผ ์žฌ ์Šค์ผ€์ฅด ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ˜ธ์ถœ์€ times ๋ฐฐ์—ด์˜ ์ด์ „ ํ˜ธ์ถœ๋กœ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ง€์—ฐ์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? ๋ด…์‹œ๋‹ค :

let start = Date.now();
let times = [];

setTimeout(function run() {
  times.push(Date.now() - start); // remember delay from the previous call

  if (start + 100 < Date.now()) alert(times); // show the delays after 100ms
  else setTimeout(run); // else re-schedule
});

// an example of the output:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100

์ฒซ ๋ฒˆ์งธ ํƒ€์ด๋จธ๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฉฐ (์‚ฌ์–‘๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๊ณ  9, 15, 20, 24๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ์ œํ•œ์€ ๊ณ ๋Œ€๋ถ€ํ„ฐ ์™”์œผ๋ฉฐ ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์—ญ์‚ฌ์ ์ธ ์ด์œ ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ธก JavaScript์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ Node.js์˜ process.nextTick ๋ฐ setImmediate์™€ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ๊ฐœ๋…์€ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Allowing the browser to render

๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋ฆฝํŠธ์— ๋งŽ์€ ์ž‘์—…์„ ๋‚˜๋ˆ„๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง„ํ–‰๋ฅ  ๋ง‰๋Œ€ ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋ชจ๋“  "๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ"๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งŽ์€ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div id="progress"></div>

<script>
  let i = 0;

  function count() {
    for (let j = 0; j < 1e6; j++) {
      i++;
      // put the current i into the <div>
      // (we'll talk about innerHTML in the specific chapter, it just writes into element here)
      progress.innerHTML = i;
    }
  }

  count();
</script>

๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด ์นด์šดํŠธ๊ฐ€ ๋๋‚œ ํ›„์— i์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹คํ–‰ ์‚ฌ์ด์— ์ ์šฉ๋˜๋ฏ€๋กœ ๋” ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค.

<div id="progress"></div>

<script>
  let i = 0;

  function count() {

    // do a piece of the heavy job (*)
    do {
      i++;
      progress.innerHTML = i;
    } while (i % 1e3 != 0);

    if (i < 1e9) {
      setTimeout(count);
    }

  }

  count();
</script>

์ด์ œ

๋Š” i์˜ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Summary

-setInterval (func, delay, ... args)๋ฉ”์†Œ๋“œ์™€setTimeout (func, delay, ... args)๋ฉ”์†Œ๋“œ๋Š”func๋ฅผdelay ๋ฐ€๋ฆฌ ์„ธ์ปจ๋“œ ํ›„์— ์ •๊ธฐ์ ์œผ๋กœ / ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

  • ์‹คํ–‰์„ ์ทจ์†Œํ•˜๋ ค๋ฉดsetInterval / setTimeout์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ ๊ฐ’์œผ๋กœclearInterval / clearTimeout์„ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘์ฒฉ ๋œsetTimeout ํ˜ธ์ถœ์€setInterval์— ๋Œ€ํ•œ๋ณด๋‹ค ์œ ์—ฐํ•œ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๋“ค์€ ์‚ฌํ˜• ์ง‘ํ–‰ ๋™์•ˆ ์ตœ์†Œํ•œ์˜ ์‹œ๊ฐ„์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œ๋กœ ํƒ€์ž„ ์•„์›ƒ ์Šค์ผ€์ฅด๋งsetTimeout (func, 0)(setTimeout (func)๊ณผ ๋™์ผ)์€ "๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ, ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—"ํ˜ธ์ถœ์„ ์Šค์ผ€์ฅดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

setTimeout (func)์˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์ผ€์ด์Šค :

  • CPU๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ "์ •์ง€"ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ.
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋„๋ก ํ•˜๊ธฐ (์ง„ํ–‰๋ฅ  ๋ง‰๋Œ€๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค).

๋ชจ๋“  ์Šค์ผ€์ค„๋ง ๋ฐฉ๋ฒ•์€ ์ •ํ™•ํ•œ ์ง€์—ฐ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜ˆ์ •๋œ ์ฝ”๋“œ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ํƒ€์ด๋จธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CPU์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…ธํŠธ๋ถ์ด ๋ฐฐํ„ฐ๋ฆฌ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ ๋ธŒ๋ผ์šฐ์ € ์™€ ์„ค์ •์— ๋”ฐ๋ผ ์ตœ์†Œ ํƒ€์ด๋จธ ํ•ด์ƒ๋„ (์ตœ์†Œ ์ง€์—ฐ ์‹œ๊ฐ„)๋ฅผ 300ms ๋˜๋Š” 1000ms๊นŒ์ง€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ