[JavaScript] setTimeoutκ³Ό setInterval
μΆμ² :: μ€μΌμ€λ§: setTimeoutκ³Ό setInterval
μΌμ μκ°μ΄ μ§λ νμ μνλ ν¨μλ₯Ό μμ½ μ€ν(νΈμΆ)ν μ μκ² νλ κ²μ "νΈμΆ μ€μΌμ€λ§(scheduling a call)"μ΄λΌ νλ€. νΈμΆ μ€μΌμ€λ§μ ꡬννλ λ°©λ²μ λ κ°μ§κ° μλ€.
-
setTimeout
:: μΌμ μκ°μ΄ μ§λ νμ ν¨μλ₯Ό μ€ννλ λ°©λ². -
setInterval
:: μΌμ μκ° κ°κ²©μ λκ³ ν¨μλ₯Ό μ€ννλ λ°©λ².μλ°μ€ν¬λ¦½νΈ λͺ μΈμμ
setTimeout
κ³ΌsetInterval
κ° λͺ μλμ΄ μμ§ μλ€. νμ§λ§ μμ€μ λμμλ λͺ¨λ λΈλΌμ°μ , Node.jsλ₯Ό ν¬ν¨ν μλ°μ€ν¬λ¦½νΈ νΈμ€νΈ νκ²½ λλΆλΆ μ΄μ μ μ¬ν λ©μλμ λ΄λΆ μ€μΌμ€λ¬λ₯Ό μ§μνλ€.
setTimeout
λ¬Έλ² ::
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
맀κ°λ³μ ::
func|code
μ€ννκ³ μ νλ μ½λ. ν¨μ λλ λ¬Έμμ΄ ννμ΄λ€. λκ°λ μ΄ μ리μ ν¨μκ° λ€μ΄κ°λ€. νμ νΈνμ±μ μν΄ λ¬Έμμ΄λ λ°μ μ μκ² ν΄λμμΌλ, μΆμ²νμ§λ μλλ€.
delay
μ€ν μ λκΈ° μκ°(μ§μ° κ°κ²©)μΌλ‘, λ¨μλ λ°λ¦¬μ΄(millisecond, 100λ°λ¦¬μ΄ = 1μ΄)μ΄λ€. κΈ°λ³Έκ°μ 0.
arg1
, arg2
...
ν¨μμ μ λ¬ν μΈμλ€λ‘, IE9 μ΄νμμ μ§μνμ§ μλλ€.
μμ ::
μλ μ½λλ₯Ό μ€ννλ©΄ 1μ΄ ν sayHi()
κ° νΈμΆλλ€.
function sayHi() {
alert('Hello');
}
setTimeout(sayHi, 1000);
μλμ κ°μ΄ ν¨μμ μΈμλ₯Ό λ겨 μ€ μ μλ€.
function sayHi(phrase, who) {
alert(phrase + ', ' + who);
}
setTimeout(sayHi, 1000, 'Hello', 'John'); // Hello, John
setTimeout
μ 첫 λ²μ§Έ μΈμκ° λ¬Έμμ΄μ΄λ©΄, μλ°μ€ν¬λ¦½νΈλ μ΄ λ¬Έμμ΄μ μ΄μ©ν΄ ν¨μλ₯Ό λ§λ λ€.
setTImeout('alert("Hello")', 1000);
νμ§λ§ λ¬Έμμ΄ μ¬μ© λ°©λ²μ μΆμ²νμ§ μλλ€. μλμ κ°μ΄ μ¬μ©νμ.
setTimeout(function() { alert('Hello') }, 1000);
// λλ νμ΄νν¨μ
setTimeout(() => alert('Hello'), 1000);
βοΈν¨μλ₯Ό μ€ννμ§ λ§κ³ λκΈ°μ.
μ΄λ³΄κ°λ°μλ
setTimeout
μ ν¨μλ₯Ό λκΈΈ λ, ν¨μ λ€μ()
μ λΆμ΄λ μ€μλ₯Ό νλ€.// μλͺ»λ μ½λ setTimeout(sayHi(), 1000);
setTimeout
μ ν¨μμ μ°Έμ‘°κ°μ λ°λλ€. κ·Έλ°λ°sayHi()
λ₯Ό μΈμλ‘ μ λ¬νλ©΄ ν¨μ μ€ν κ²°κ³Όκ° μ λ¬λμ΄ λ²λ¦°λ€.sayHi()
μλ λ°νλ¬Έμ΄ μκΈ° λλ¬Έμ μ€ν κ²°κ³Όλundefined
μΌλ‘ λμ¨λ€.setTimeout
μ μ€μΌμ€λ§ν λμμ μ°Ύμ§ λͺ»ν΄, μνλ λλ‘ μ½λκ° λμνμ§ μλλ€.
clearTimeoutμΌλ‘ μ€μΌμ€λ§ μ·¨μνκΈ°
setTimeout
μ νΈμΆνλ©΄ "νμ΄λ¨Έ μλ³μ(timer identifier)"κ° λ°νλλ€. μ€μΌμ€λ§μ μ·¨μνκ³ μΆμ λ μλ³μ(μλ μμμμ timerId
)λ₯Ό μ¬μ©νλ©΄ λλ€.
let timerId = setTImeout(() => alert('μλ¬΄λ° μΌλ μΌμ΄λμ§ μλλ€.'), 1000);
alert(timerId); // νμ΄λ¨Έ μλ³μ
clearTimeout(timerId);
alert(timerId); // μ νμ΄λ¨Έ μλ³μμ λμΌν¨.(μ·¨μ νμλ μλ³μμ κ°μ nullμ΄ λμ§ μλλ€.)
μμλ₯Ό μ€ννλ©΄ alert
μ°½μ΄ 2κ° λ¨λλ°, λΈλΌμ°μ νκ²½μμ νμ΄λ¨Έ μλ³μκ° μ«μλΌλ κ²μ μ μ μλ€.
λ€λ₯Έ νΈμ€νΈ νκ²½μμ νμ΄λ¨Έ μλ³μκ° μ«μν μ΄μΈμ μλ£νμΌ μλ μλ€. Node.jsμμλ setTimeout
μ μ€ννλ©΄ νμ΄λ¨Έ κ°μ²΄κ° λ°νλλ€.
μ€μΌμ€λ§μ κ΄ν λͺ μΈλ λ°λ‘ μ‘΄μ¬νμ§ μλλ€. λͺ μΈκ° μκΈ° λλ¬Έμ νΈμ€νΈ νκ²½λ§λ€ μ½κ°μ μ°¨μ΄κ° μμ μ λ°μ μλ€.
μ°Έκ³ λ‘ λΈλΌμ°μ λ HTML5μ timers sectionμ μ€μνκ³ μλ€.
setInterval
setInterval
λ©μλλ setTimeout
κ³Ό λμΌν λ¬Έλ²μ μ¬μ©νλ€.
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
μΈμ μμ λμΌνλ, setTimeout
μ΄ ν¨μλ₯Ό λ¨ νλ²λ§ μ€ννλ κ²κ³Ό λ¬λ¦¬, setInterval
μ ν¨μλ₯Ό μ£ΌκΈ°μ μΌλ‘ μ€ννλ€.
ν¨μ νΈμΆμ μ€λ¨νλ €λ©΄ clearInterval(timerId)
μ μ¬μ©νλ€.
μλ μμ λ₯Ό μ€ννλ©΄ λ©μΈμ§κ° 2μ΄ κ°κ²©μΌλ‘ 보μ¬μ§λ€κ° 5μ΄ μ΄νμλ λ μ΄μ λ©μΈμ§κ° 보μ΄μ§ μλλ€.
// 2μ΄ κ°κ²©μΌλ‘ λ©μΈμ§λ₯Ό 보μ¬μ€
let timerId = setInterval(() => alert('tick'), 2000);
// 5μ΄ νμ μ μ§
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);
βοΈ
alert
μ°½μ΄ λ μλλΌλ νμ΄λ¨Έλ λ©μΆμ§ μλλ€.ν¬λ‘¬κ³Ό νμ΄μ΄νμ€λ₯Ό ν¬ν¨ν λλΆλΆμ λΈλΌμ°μ λ
alert / confirm / prompt
μ°½μ΄ λ μλ λμμλ λ΄λΆ νμ΄λ¨Έλ₯Ό λ©μΆμ§ μλλ€.μ μμ λ€μ μ€ννκ³ μ²« λ²μ§Έ
alert
μ°½μ΄ λ΄μ λ λͺ μ΄κ° κΈ°λ€λ Έλ€κ° μ°½μ λ«μΌλ©΄, λ λ²μ§Έalert
μ°½μ΄ λ°λ‘ λνλλ κ²μ λ³΄κ³ μ΄λ₯Ό νμΈ ν μ μλ€. λͺ μν μ§μ° μκ° 2μ΄λ³΄λ€alert
μ°½ κ°κ²©μ΄ 짧μμ§λ€.
μ€μ²© setTimeout
무μΈκ°λ₯Ό μΌμ κ°κ²©μ λκ³ μ€ννλ λ°©λ²μ ν¬κ² 2κ°μ§κ° μλ€.
νλλ setInterval
μ μ΄μ©νλ λ°©λ²μ΄κ³ , λ€λ₯Έ νλλ μλ μμμ κ°μ΄ μ€μ²© setTimeout
μ μ΄μ©νλ λ°©λ²μ΄λ€.
/* setIntervalμ μ΄μ©νμ§ μκ³ μλμ κ°μ΄ μ€μ²© setTimeoutμ μ¬μ©ν¨ */
// let timerId = setInterval(() => alert('tick'), 2000);
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
// 2μ΄λ§λ€ λ°μ
setTimeout
μ (*)
λ‘ νμν μ€μ μ€νμ΄ μ’
λ£λλ©΄ λ€μ νΈμΆμ μ€μΌμ€λ§νλ€.
μ€μ²© setTimeout
μ μ΄μ©νλ λ°©λ²μ setInterval
μ μ¬μ©νλ λ°©λ²λ³΄λ€ μ μ°νλ€. νΈμΆ κ²°κ³Όμ λ°λΌ νΈμΆμ μνλ λ°©μμΌλ‘ μ‘°μ ν΄ μ€μΌμ€λ§ ν μ μκΈ° λλ¬Έμ΄λ€.
5μ΄κ°κ²©μΌλ‘ μλ²μ μμ²μ λ³΄λ΄ λ°μ΄ν°λ₯Ό μ»κ³ μλ€κ³ κ°μ ν΄λ³΄μ. μλ²κ° κ³ΌλΆνμνλΌλ©΄ μμ² κ°κ²©μ 10μ΄, 20μ΄, 40μ΄ λ±μΌλ‘ μ¦κ°μμΌμ£Όλ κ²μ΄ μ’μ κ²μ΄λ€. μλλ μ΄λ₯Ό ꡬνν μμ¬ μ½λμ΄λ€.
let delay = 5000;
let timerId = setTimeout(function request() {
// .. μμ² λ³΄λ΄κΈ° ..
if(/* μλ² κ³ΌλΆνλ‘ μΈν μμ² μ€ν¨ */) {
// μμ² κ°κ²©μ λλ¦°λ€.
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
CPU μλͺ¨κ° λ§μ μμ
μ μ£ΌκΈ°μ μΌλ‘ μ€ννλ κ²½μ°μλ setTimeout
μ μ¬κ· μ€ννλ λ°©λ²μ΄ μ μ©νλ€. μμ
μ 걸리λ μκ°μ λ°λΌ λ€μ μμ
μ μ λμ μΌλ‘ κ³νν μ μκΈ° λλ¬Έμ΄λ€.
μ€μ²©
setTimeout
μ μ΄μ©νλ λ°©λ²μ μ§μ°κ°κ²©μ 보μ₯νλ,setInterval
μ μ΄λ₯Ό 보μ₯νμ§ μλλ€.
μλ λ μμλ₯Ό λΉκ΅ν΄λ³΄μ. 첫λ²μ§Έλ setInterval
μ μ΄μ©νμλ€.
let i = 1;
setInterval(function() {
func(i++);
}, 100);
λ λ²μ§Έ μμμμ μ€μ²©setTimeout
μ μ΄μ©νλ€.
let i = 1;
setTimeout(function run() {
func(i++);
setTimeout(run, 100);
}, 100);
setInerval
μ μ΄μ©ν μμμμ , λ΄λΆ μ€μΌμ€λ¬κ° func(i++)
λ₯Ό 100λ°λ¦¬μ΄λ§λ€ μ€ννλ€.
setInterval
μ μ¬μ©νλ©΄ func
νΈμΆ μ¬μ΄μ μ§μ° κ°κ²©μ΄ μ€μ λͺ
μν κ°κ²©(100ms)λ³΄λ€ μ§§μμ§λ€.
func
μ μ€ννλλ° "μλͺ¨λλ" μκ°μ΄ μ§μ° κ°κ²©μ ν¬ν¨λκΈ° λλ¬Έμ μ΄λ° μΌμ΄ λ°μνλ€. μ§κ·Ήν μ μμ μΈ λμμ΄λΌ ν μ μλ€.
κ·Έλ°λ° func
μ μ€ννλλ° κ±Έλ¦¬λ μκ°μ΄ λͺ
μμ μ§μ° κ°κ²©λ³΄λ€ κΈΈλ©΄ μ΄λ»κ² λ κΉ?
μ΄λ° κ²½μ° μμ§μ΄ func
μ μ€νμ΄ μ’
λ£λ λκΉμ§ κΈ°λ€λ €μ€λ€. func
μ μ€νμ΄ μ’
λ£λλ©΄ μμ§μ μ€μΌμ€λ¬λ₯Ό νμΈνκ³ , μ΄λ μ§μ° μκ°μ΄ μ§λ¬μΌλ©΄ λ€μ νΈμΆμ λ°λ‘ μμνλ€.
ν¨μλ₯Ό νΈμΆν λλ§λ€ 걸리λ μκ°μ΄ delay
λ°λ¦¬μ΄λ³΄λ€ κΈΈλ©΄, λͺ¨λ ν¨μκ° μΌ μμ΄ κ³μ μ°μ νΈμΆλλ€.
μ΄μ λ°ν΄ μ€μ²©, setTimeout
μ μ΄μ©νλ©΄ μλμ κ°μ΄ μ€ννλ¦μ΄ μ΄μ΄μ§λ€.
μ€μ²© setTimeout
μ μ¬μ©νλ©΄ λͺ
μν μ§μ°(μ¬κΈ°μλ 100ms)μ΄ λ³΄μ₯λλ€.
μ΄λ κ² μ§μ° κ°κ²©μ΄ 보μ₯λλ μ΄μ λ μ΄μ ν¨μμ μ€νμ΄ μ’ λ£λ μ΄νμ λ€μ ν¨μ νΈμΆμ λν κ³νμ΄ μΈμμ§κΈ° λλ¬Έμ΄λ€.
βοΈκ°λΉμ§ 컬λ μ κ³Ό setInterval / setTimeout
setInterval
μ΄λsetTimeout
μ ν¨μλ₯Ό λκΈΈ λ, ν¨μμ λν λ΄λΆ μ°Έμ‘°κ° μλ‘κ² λ§λ€μ΄μ§κ³ μ°Έμ‘° μ λ³΄κ° μ€μΌμ€λ¬μ μ μ₯λλ€. λ°λΌμ ν΄λΉ ν¨μλ₯Ό μ°Έμ‘°νλ κ²μ΄ μμ΄λsetInterval / setTimeout
μ λκΈ΄ ν¨μλ κ°λΉμ§ 컬λ μ μ λμμ΄ λμ§ μλλ€.// μ€μΌμ€λ¬κ° ν¨μλ₯Ό νΈμΆν λκΉμ§ ν¨μλ λ©λͺ¨λ¦¬μ μ μ§λλ€. setTimeout(function() {...}, 100);
setInterval
μ λ겨주λ ν¨μλclearInterval
μ΄ νΈμΆλκΈ° μ κΉμ§ λ©λͺ¨λ¦¬μ μ μ§λλ€.κ·Έλ°λ° μ΄λ° λμ λ°©μμλ λΆμμ©μ΄ νλ μλ€. ν¨μκ° μΈλΆ λ μ컬 νκ²½μ μ°Έμ‘°νκ³ μμΌλ©΄ ν΄λΉ ν¨μκ° λ©λͺ¨λ¦¬μ λ¨μμλ λμ, μΈλΆ λ³μ μμ λ©λͺ¨λ¦¬μ λ¨μμκΈ° λλ¬Έμ΄λ€. μ΄λ κ² λλ©΄ μ€μ ν¨μκ° μ°¨μ§νμ΄μΌ νλ 곡κ°λ³΄λ€ λ λ§μ λ©λͺ¨λ¦¬ 곡κ°μ΄ μ¬μ©λλ€. μ΄λ° λΆμμ©μ λ°©μ§νλ €λ©΄ μ€μΌμ€λ§ν νμκ° μμ΄μ§ ν¨μλ μ무리 μλλΌλ μ·¨μν΄μΌ νλ€.
μΆκ° λ΄μ©
μλ°μ€ν¬λ¦½νΈ νμ΄λ° μ΄λ²€νΈ
1. delayμ λνμ¬
μΈλ» 보기μλ setInterval
κ³Ό setTimeout
ν¨μλ λ§€μ° μ μ¬ν μ μ΄ λ§λ€. λ€λ₯Έμ μ΄λΌ νλ©΄ λ°λ³΅μ€νμ νλλ, ν λ² μ€ννλλμ μ λλ‘ λ³΄μΌ μλ μλ€ νμ§λ§ μ λ§ λ€λ₯Έ μ μ μ§μ°μκ°(Delay)κ³Ό κ° ν¨μμ μ²λ¦¬ λ°©μμ΄λ€.
1.1) setInterval
Real delay for setInterval is actually less than given. If the execution is impossible, it is queued. If the browser is busy, and the execution is already queued, setInterval skips it.
[μΆμ²] Javascript Tutorial - Understanding timers: setTimeout and setInterval
μ€λͺ
νμλ©΄ setInterval
ν¨μμ μ€μ μ§μ°μκ°μ κ°λ°μκ° μ€ μκ°λ³΄λ€ μ€μ μ μΌλ‘ μ λ€λ λ»μ΄λ€. λν μ€νν μ μλ μνλΌλ©΄ νμ μ μ₯λλ€. λν λ§μ½μ λΈλΌμ°μ κ° μ²λ¦¬ν μ μλ μν(λ°μ μν)μ΄κ³ , μ΄λ―Έ νμ μ μ₯λ κ²μ΄ μλ€λ©΄ setInterval
μ 무μνλ€.
λ€μ λ§ν΄μ setInterval
μ μ§μ λ μκ° κ°κ²©λ§νΌ 무쑰건 μ§μ λ μ½λλ₯Ό νΈμΆνκ³ μ νλ€. νμ§λ§ μ§μ λ μκ° κ°κ²©μ λλ¬νμμλ λΆκ΅¬νκ³ μ§μ λ μ½λλ₯Ό μ€νν μ μλ μνλΌλ©΄ setInterval
μ μ΄λ²€νΈλ₯Ό ν(queue)μ μ μ₯νλ€.
μ¬κΈ°μ ν(queue)λ₯Ό μ‘°κΈ λ μμΈν μμ보μ. setInterval
μμ νμ ν¬κΈ°λ 1μ΄λ€. νλμ μ€νλ§μ μ μ₯ν μ μλ€. κ·Έλ¦¬κ³ νμ μ μ₯λ κ²μ΄ μλ€λ©΄ μ€νν΄μΌν μκ° κ°κ²©κ³Όλ κ΄κ³ μμ΄ μ€ν κ°λ₯ν μνμΌ λ, μ¦μ νμμ μ΄λ²€νΈλ₯Ό κΊΌλ΄ μ€ννκ² λμ΄ μλ€.
νμ§λ§ μ‘°κΈ λ κΌ¬μμ μκ°ν΄λ³΄μ. μ ν΄μ§ μκ°μ 100msλΌκ³ κ°μ . κ·Έλ¬λ©΄ setInterval
μ΄ μ²μ μ€νν λλ 100msμκ°λμμ μ§μ λ μ½λ(A)λ₯Ό μ€νν κ²μ΄λ€. κ·Έλ¦¬κ³ 200msλΌλ μκ°λκ° λλ©΄ λ€μ νλ² μ§μ λ μ½λ(B)λ₯Ό μ€ννλ € ν κ²μ΄λ€. νμ§λ§ μ΄μ μ½λ(A) μ§μ° λ±μ μ΄μ λ‘ μ€νν μ μλ μνλΌλ©΄ setInterval
μ νμ¬ μ€νν μ½λ(B)λ₯Ό νμ μ μ₯νλ€. κ·Έλ¦¬κ³ 300msλΌλ μκ°λκ° λμ΄ λ€μ μ§μ λ μ½λ(C)λ₯Ό μ€ννλ € νλ€. νμ§λ§ μ΄μ μ½λ(Aκ° μμ§ λλμ§ μμ μνμμ νμ μ΄λ―Έ μ€νν μ½λ(B)κ° μ μ λμ΄ μλ€λ©΄ setInterval
μ νμ¬ μ€νν μ½λ(C)λ₯Ό 무μνλ€.
setInterval
μ μ ν΄μ§ μκ° κ°κ²©λ΄μμ μ§μ λ μ½λκ° μ€νλλ κ²½μ° κΉλνκ² μ²λ¦¬ν μ μλ ν¨μμ΄λ€.
νμ§λ§ μ§μ λ μ½λκ° μ§μ°λμ΄ λ€μ μ΄λ²€νΈ λ°μμν€κΈ°κΉμ§ μν₯μ λΌμΉλ κ²½μ° "무μ λΉνλ μ΄λ²€νΈ"κ° μκΈΈ μΌλ €κ° μλ€.
1.2) setTimeout
setTimeout
ν¨μλ λ¨ νλ² μ§μ λ μ½λλ₯Ό μ€ννμ§λ§ μ¬κ·νΈμΆ λ±μ λ°©λ²μ μ΄μ©ν΄μ λ°λ³΅μ μΌλ‘ νΈμΆν μ μλ€.
setTimeout
ν¨μλ μ§μ λ μκ°λ§νΌμ κΈ°λ€λ¦° ν μ§μ λ μ½λλ₯Ό μ€ννλ€. κ·Έλ¦¬κ³ λ€μ νΈμΆνλ μκΈ°λ μ§μ λ μ½λ λ΄μμ μ μκ° κ°λ₯νλ€.
function foo() {
// process..
loop = setTimeout(function() { foo() }, 1000);
}
var loop = setTimeout(function() { foo() }, 1000);
μ μ½λλ μ§μ λ μ½λ(processμ£Όμμ²λ¦¬λ κ²) μ΄νμ λ€μ setTimeout
μΌλ‘ μ¬κ·νΈμΆμ νκ³ μλ€. μ΄λ κ² μ²λ¦¬λ₯Ό νλ€λ©΄ setInterval
μμ λ΄€λ μ΄λ²€νΈκ° 무μλΉν μΌμ μλ€.
μλ₯Ό λ€μ΄, setTimeout
μ μ€ννλ©΄ μ²μ μ§μ λ κ°κ²©λ§νΌ κΈ°λ€λ¦° ν μ§μ λ μ½λλ₯Ό μ€ννλ€. κ·Έλ¦¬κ³ μ§μ λ μ½λκ° λλ μμ μμ λ€μ setTimeout
ν¨μλ₯Ό νΈμΆνλ€. κ·Έλ¬λ©΄ μ§μ λ μ½λκ° μ§μ°λλλΌλ λͺ¨λ μ²λ¦¬κ° λλ λ€μ setTimeout
μ νΈμΆνκΈ° λλ¬Έμ μ΄λ²€νΈκ° μ€μ²©λ μΌμ μμ κ²μ΄λ€. (ajax λ±μ λΉλκΈ°μ μ½λκ° μλ€λ©΄ μ½λ°±ν¨μμ²λΌ λ§λ€μ΄μΌ ν νμλ μλ€.)
λκΈ°μκ°μ΄ 0μΈ setTimeout
setTimeout(func, 0)
μ΄λ setTimeout(func)
μ μ¬μ©νλ©΄ setTimeout
μ λκΈ°μ¬κ°μ 0μΌλ‘ μ€μ ν μ μλ€. μ΄λ κ² λκΈ° μκ°μ 0μΌλ‘ μ€μ νλ©΄ func
μ κ°λ₯ν 빨리 μ€νν μ μλ€. λ€λ§, μ΄λ μ€μΌμ€λ¬λ νμ¬ μ€νμ€μΈ μ€ν¬λ¦½νΈμ μ²λ¦¬κ° μ’
λ£λ μ΄νμ μ€μΌμ€λ§ν ν¨μλ₯Ό μ€ννλ€.
μ΄λ° νΉμ§μ μ΄μ©νλ©΄ νμ¬ μ€ν¬λ¦½νΈμ μ€νμ΄ μ’ λ£λ "μ§νμ" μνλ ν¨μλ₯Ό μ€νλ μ μκ² ν΄μ€λ€.
μλ μμλ₯Ό μ€ννλ©΄ μΌλΏμ°½μ "Hello"μ "World"κ° μ΄μ΄μ μΆλ ₯λλ€.
setTimeout(() => alert('World'));
alert('Hello');
μ μμμμ 첫 λ²μ§Έ μ€μ "'0λ°λ¦¬μ΄ νμ ν¨μ νΈμΆνκΈ°'λΌλ ν μΌμ κ³ννμ κΈ°λ‘"ν΄μ£Όλ μν μ νλ€. κ·Έλ°λ° μ€μΌμ€λ¬λ νμ¬ μ€ν¬λ¦½νΈ(alertν¨μ)μ μ€νμ΄ μ’
λ£λκ³ λμμΌ "κ³ννμ μ΄λ€ ν μΌμ΄ μ ν μλμ§ νμΈ"νλ―λ‘, "Hello"
κ° λ¨Όμ , "World"
μ κ·Έ λ€μ μΆλ ₯λλ€.
λκΈ°μκ°μ΄ 0μΈ setTimeoutμ νμ©ν λΈλΌμ°μ νκ²½μμμ μ¬λ‘λ Event loop: microtasks and macrotasksμμ μμΈν λ€λ£¬λ€.
βοΈλΈλΌμ°μ νκ²½μμ μ€μ λκΈ° μκ°μ 0μ΄ μλλ€.
λΈλΌμ°μ λ HTML5νμ€μμ μ ν μ€μ²© νμ΄λ¨Έ μ€ν κ°κ²¬ κ΄λ ¨ μ μ½μ¬νμ μ€μνλ€. ν΄λΉ νμ€μ "λ€μ― λ²μ§Έ μ€μ²© νμ΄λ¨Έ μ΄νμ λκΈ° μκ°μ μ΅μ 4λ°λ¦¬μ΄ μ΄μμ κ°μ ν΄μΌ νλ€."λΌλ μ¬νμ΄ λͺ μλμ΄ μλ€.
μμλ₯Ό ν΅ν΄ μ΄ μ μ½μ¬νμ μ΄ν΄ν΄λ³΄μ. μμμ μ°μΈ
setTimeout
μ μ§μ°μμ΄ ν¨μ runμ λ€μ νΈμΆν μ μκ² μ€μΌμ€λ§ λμ΄μλ€. λ°°μ΄times
μλ μ€μ μ§μ° κ°κ²©μ λν μ λ³΄κ° κΈ°λ‘λλλ‘ ν΄λμλ€. λ°°μ΄ timesμ μ΄λ€ κ°μ΄ μ μ₯λλμ§ μμ보μ.let start = Date.now(); let times = []; setTimeout(function run() { // μ΄μ νΈμΆμ΄ λλ μμ κ³Ό νμ¬ νΈμΆμ΄ μμλ μμ μ μμ°¨λ₯Ό κΈ°λ‘. times.push(Date.now() - start); // μ§μ° κ°κ²©μ΄ 100msλ₯Ό λμ΄κ°λ©΄, arrayλ₯Ό μΌλΏμ°½μ λμμ€. if(start + 100 < Date.now()) alert(times); // μ§μ° κ°κ²©μ΄ 100msλ₯Ό λμ΄κ°μ§ μμΌλ©΄ μ¬μ€μΌμ€λ§ν¨. else setTimeout(run); }); // μΆλ ₯μ°½ μμ: // 1,1,1,1,5,10,14,19,23,29,33,39,42,47,52,56,61,67,72,77,83,88,93,96,102
μ΄κΈ° νμ΄λ¨Έλ€μ(μ€νμ μ ν κ²μ²λΌ) μ§μ° μμ΄ λ°λ‘ μ€νλλ€. κ·Έλ°λ° λ€μ―λ² μ§Έ μ€μ²© νμ΄λ¨Έ μ΄νμ μ§μ° κ°κ²©μ΄ 4λ°λ¦¬μ΄ μ΄μμ΄ λμ΄
5,10,14,19..
μ κ°μ κ°μ΄ μ μ₯λλ κ²μ λ³Ό μ μλ€.μ΄λ° μ μ½ μ¬νμ
setTimeout
λΏλ§ μλλΌsetInterval
μλ μ μ©λλ€.setInterval(f)
λ μ²μ λͺ λ²μ ν¨μf
λ₯Ό μ§μ°μμ΄ μ€ννμ§λ§, λμ€μ μ§μ° κ°κ²©μ 4λ°λ¦¬μ΄ μ΄μμΌλ‘ λλ €λ²λ¦°λ€.μ΄λ μ€λμ λΆν° μλ μ μ½μΈλ°, ꡬμ μ€ν¬λ¦½νΈ μ€ μΌλΆλ μμ§ μ΄ μ μ½μ μμ‘΄νλ κ²½μ°κ° μμ΄μ μ€νλ μ΄ μ μ½μ¬νμ λ³κ²½νμ§ μκ³ λͺ μνκ³ μλ€
ννΈ, μλ²μΈ‘μ μ΄λ° μ μ½μ΄ μλ€. Node.jsμ process.nextTickκ³Ό setImmediateλ₯Ό μ΄μ©νλ©΄ λΉλκΈ° μμ μ μ§μ° μμ΄ μ€νν μ μλ€. μμμ μΈκΈλ μ μ½μ λΈλΌμ°μ μ νμ λλ€.
μμ½
setInterval(func, delay, ..args)
κ³ΌsetTimeout(func, delay, ..args)
μdelay
λ°λ¦¬μ΄ νμfunc
μ κ·μΉμ μΌλ‘, λλ νλ² μ€ννλλ‘ ν΄μ€λ€.setInterval / setTimeout
μ νΈμΆνκ³ λ°νλ°μ κ°μclearInterval / clearTimeout
μ λ겨주면 μ€μΌμ€λ§μ μ·¨μν μ μλ€.- μ€μ²©
setTimeout
μ μ¬μ©νλ©΄setInterval
μ μ¬μ©ν κ²λ³΄λ€ μ μ°ν μ½λλ₯Ό μμ±ν μ μλ€. μ§μ°κ°κ²©μ΄ 보μ₯λλ κ² λν μ΄μ μ΄λ€. - λκΈ°μκ°μ΄ 0μΈ setTimeout(
setTimeout(func, 0)
μ΄λsetTimeout(func)
)μ μ¬μ©νλ©΄ "νμ¬ μ€ν¬λ¦½νΈμ μ€νμ΄ μλ£λ νμ κ°λ₯ν λΉ λ₯΄κ²" μνλ ν¨μλ₯Ό νΈμΆν μ μλ€. - μ§μ°μμ΄ μ€μ²©
setTimeout
μμ 5ν μ΄μ νΈμΆνκ±°λ μ§μ°μλsetInterval
μμ νΈμΆμ΄ 5νμ΄μ μ§νλλ©΄, 4λ°λ¦¬μ΄ μ΄μμ μ§μ° κ°κ²©μ κ°μ μ μΌλ‘ λν΄μ€λ€. μ΄λ λΈλΌμ°μ μμλ§ μ μ©λλ μ¬νμ΄λ©°, νμ νΈνμ±μ μν΄ μ μ§λκ³ μλ€.
λͺ¨λ μ€μΌμ€λ§ λ©μλκ° λͺ μν μ§μ° κ°κ²©μ 보μ₯νμ§ μλλ€λ μ μ μ μν΄μΌ νλ€.
μλμ κ°μ μν©μμ λΈλΌμ°μ λ΄ νμ΄λ¨Έκ° λλ €μ§λ©΄ μ§μ° κ°κ²©μ΄ 보μ₯λμ§ μλλ€.
- CPUκ° κ³ΌλΆν μνμΈ κ²½μ°
- λΈλΌμ°μ νμ΄ λ°±κ·ΈλΌμ΄λ λͺ¨λμΈ κ²½μ°
- λ ΈνΈλΆμ΄ λ°°ν°λ¦¬μ μμ‘΄ν΄μ ꡬλμ€μΈ κ²½μ°
μ΄λ° μν©μμ νμ΄λ¨Έμ μ΅μ μ§μ° μκ°μ 300λ°λ¦¬μ΄μμ μ¬νλ©΄ 1000λ°λ¦¬μ΄κΉμ§ λμ΄λλ€. μ°μ₯ μκ°μ λΈλΌμ°μ λ ꡬλμ€μΈ μ΄μ체μ μ μ±λ₯ μ€μ μ λ°λΌ λ€λ₯΄λ€.
κ³Όμ
μΌμ΄κ°κ²©μΌλ‘ μ«μ μΆλ ₯νκΈ°
from
μ λͺ
μν μ«μλΆν° to
μ λͺ
μν μ«μκΉμ§ μΆλ ₯ν΄μ£Όλ ν¨μ printNumbers(from, to)
λ₯Ό λ§λ€μ΄λ³΄μ. μ«μλ μΌ μ΄ κ°κ²©μΌλ‘ μΆλ ₯λμ΄μΌ νλ€.
λ κ°μ§ λ°©λ²μ μ¬μ©ν΄ λ§λ€μ΄μΌ νλ€.
setInterval
μ μ΄μ©ν λ°©λ²- μ€μ²©
setTimeout
μ μ΄μ©ν λ°©λ²
ν΄λ΅ :
setInterval
μ μ΄μ©ν λ°©λ²
setInterval
function printNumbers(from, to) {
let current = from;
let timerId = setInterval(function() {
alert(current);
if(current === to) {
clearInterval(timerId);
}
current++;
}, 1000);
}
// usage:
printNumbers(5, 10);
- μ€μ²©
setTimeout
μ μ΄μ©ν λ°©λ²
function printNumbers(from, to) {
let current = from;
setTimeout(function go() {
alert(current);
if(current < to) {
setTimeout(go, 1000);
}
current++;
}, 1000);
}
// usage:
printNumbers(5, 10);
λ λ°©λ² λͺ¨λμμ μ΅μ΄ νΈμΆ μ΄μ μ(첫 λ²μ§Έ μΌλΏ μ°½μ΄ λ¨κΈ° μ μ)1000ms
μ μ§μ° κ°κ²©μ λμλ€λ μ μ μ£Όλͺ©νκΈΈ λ°λλ€.
μ΄κΈ° μ§μ°μκ° μμ΄ ν¨μλ₯Ό λ°λ‘ μ€ννλ €λ©΄ μλμ κ°μ΄ λ³λμ μ€μμ ν¨μλ₯Ό νΈμΆν΄μ€μΌ νλ€.
function printNumbers(from, to) {
let current = from;
function go() {
alert(current);
if(current === to) {
clearInterval(timerId);
}
current++;
}
go();
let timerId = setInterval(go, 1000);
}
printNumbers(5, 10);
setTimeoutμ 무μμ 보μ¬μ€κΉ?
μλ μ½λμμ setTimeout
μ μ΄μ©ν΄ νΈμΆμ μ€μΌμ€λ§νκ³ μλ€. κ·Έλ°λ° κ·Έ μλ μ½λμμ μ€ν μκ°μ΄ 100msμ΄μ 걸리λ λ¬΄κ±°μ΄ μμ
μ νκ³ μλ€.
μ΄λ° κ²½μ° setTimeoutμ λκ²¨μ€ ν¨μλ μΈμ μ€νλ κΉ?
- λ°λ³΅λ¬Έ μ€ν ν
- λ°λ³΅λ¬Έ μ€ν μ
- λ°λ³΅λ¬Έμ΄ μ€νλλ μμ
μΌλΏμ°½μ μ΄λ€ κ°μ΄ μΆλ ₯λ κΉ?
let i = 0;
setTImeout(() => alert(i), 100); // ?
// μλ λ°λ³΅λ¬Έμ λ€ λλλ° 100ms μ΄μμ μκ°μ΄ κ±Έλ¦°λ€κ³ κ°μ .
for(let j = 0; j < 10000000; j++) {
i++;
}
ν΄λ΅ :
setTimeout
μ νμ¬ μ€νμ€μΈ μ½λμ μ€νμ΄ μ’
λ£λμμ λ μ€νλλ€.
λ°λ³΅λ¬Έ μ€νμ΄ μ’
λ£λκ³ λ ν i
λ 10000000
μ΄ λλ―λ‘, μΌλΏ μ°½μ 10000000
μ΄ μΆλ ₯λλ€.
let i = 0;
setTimeout(() => alert(i), 100); // 10000000μ΄ μΆλ ₯λλ€.
// assume that the time to execute this function is > 100ms
for(let j = 0; j < 10000000; j++) {
i++;
}
'π©π»βπ»STUDY > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript / ES6] let, constμ λΈλ‘ λ 벨 μ€μ½ν (0) | 2021.02.11 |
---|---|
[JavaScript] Call By Value (0) | 2021.01.29 |
[JavaScript] JavaScript μ½μ λ°©μκ³Ό μμΉ (0) | 2020.09.24 |
[JavaScript] λ¬Έμμ λ‘λμμ - onload / DOMContentLoaded (0) | 2020.09.24 |
[JavaScript] return / break (0) | 2020.08.13 |