์ผ์ ์๊ฐ์ด ์ง๋ ํ์ ์ํ๋ ํจ์๋ฅผ ์์ฝ ์คํ(ํธ์ถ)ํ ์ ์๊ฒ ํ๋ ๊ฒ์ 'ํธ์ถ ์ค์ผ์ค๋ง(scheduling a call)'์ด๋ผ๊ณ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ช
์ธ์์๋ setTimeout
๊ณผ setInterval
์ด ๋ช
์๋์ด ์์ง๋ ์์ง๋ง, ๋ธ๋ผ์ฐ์ ์ node.js
๋ฅผ ํฌํจํ Javascript ํธ์คํธ ํ๊ฒฝ ๋๋ถ๋ถ์ด ์ง์ํฉ๋๋ค.
setTimeout
setTimeout ๋ฌธ๋ฒ(Syntax)
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...);
setTimeout ๋งค๊ฐ๋ณ์(Parameter)
func|code
- ์คํํ๊ณ ์ ํ๋ ์ฝ๋๋ก, ํจ์ ๋๋ ๋ฌธ์์ด ํํ์ ๋๋ค. ๋ณดํต ์ด ์๋ฆฌ์ ํจ์๊ฐ ๋ค์ด๊ฐ๋ฉฐ ๋ฌธ์์ด๋ ๋ค์ด๊ฐ์ง๋ง ์ถ์ฒ๋์ง ์์ต๋๋ค.
delay
- ์คํ ์ ๋๊ธฐ ์๊ฐ์ผ๋ก, ๋จ์๋ ๋ฐ๋ฆฌ์ด(millisecond, 1000๋ฐ๋ฆฌ์ด = 1์ด)์ด๋ฉฐ ๊ธฐ๋ณธ ๊ฐ์ 0์ ๋๋ค.
arg1, arg2
...
- ํจ์์ ์ ๋ฌํ ์ธ์๋ค(arguments). IE9 ์ดํ์์๋ ์ง์๋์ง ์์ต๋๋ค.
setTimeout ์ฌ์ฉ ์์
- ์ธ์์๋ ํจ์
function sayHello() {
alert('Hello!')
}
setTimeout(sayHello, 1000); // 1์ด ๋ค์ sayHello()๋ฅผ ์คํ์ํด
- ์ธ์ ์๋ ํจ์
function sayHello(name) {
alert('Hello ' + name + '!')
}
setTimeout(sayHello, 1000, 'eun'); // Hello eun!
sayHello
ํจ์์ ๋งค๊ฐ๋ณ์(Parameter) ์ธ์๋ก eun
์ ๋๊ธฐ๊ณ ์คํํ์ต๋๋ค.
clearTimeout์ผ๋ก ์ค์ผ์ค๋ง ์ทจ์ํ๊ธฐ
setTimeout
์ ํธ์ถํ๋ฉด 'ํ์ด๋จธ ์๋ณ์(timer identifier)'๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ฆ,setTimeout
์timerId
๋ฅผ ๋ฐํํฉ๋๋ค.- ์ค์ผ์ค๋ง์ ์ทจ์ํ๊ธฐ ์ํด์๋
clearTimeout
ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// ๊ธฐ๋ณธ ๋ฌธ๋ฒ
let timerId = setTimeout(...);
clearTimeout(timerId);
// ์ฌ์ฉ ์์
let timerId = setTimeout(() => alert("์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค."), 1000);
alert(timerId); // ํ์ด๋จธ ์๋ณ์
clearTimeout(timerId);
alert(timerId); // ์ ํ์ด๋จธ ์๋ณ์์ ๋์ผํจ (์ทจ์ ํ์๋ ์๋ณ์์ ๊ฐ์ null์ด ๋์ง ์์ต๋๋ค.)
์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ํ์ด๋ฐ ์๋ณ์๊ฐ ์ซ์๋ผ๋ ๊ฑธ ์ ์ ์๊ณ , clearTimeout
์ผ๋ก ์ค์ผ์ค๋ง์ด ์ทจ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
setInterval
setInterval
๋ฉ์๋๋ setTimeout
๊ณผ ๋์ผํ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...);
- ์ธ์ ์ญ์ ๋์ผํฉ๋๋ค. ๋ค๋ง,
setTimeout
์ ํจ์๋ฅผ ๋จ ํ๋ฒ๋ง ์คํํ์ง๋ง,setInterval
์ ํจ์๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๊ฒ ๋ง๋ญ๋๋ค. - ํจ์ ํธ์ถ์ ์ค๋จํ๊ธฐ ์ํด์๋
clearInterval(timerId)
์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
// 2์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค
let timeId = setInterval(() => alert('๋๋ฑ๋๋ฑ'), 2000);
// 5์ด ํ์ ์ ์ง
setTimeout(() => { clearInterval(timeId); alert('์๊ณ ๋ฐฅ ์ฃผ์ธ์ฌ'); }, 6000);
์ค์ฒฉ setTimeout
ํจ์๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ setInterval
ํจ์ ์ด์ธ์๋ ์ค์ฒฉ setTimeout
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
/* setInterval์ ์ด์ฉํ์ง ์๊ณ ์๋์ ๊ฐ์ด ์ค์ฒฉ setTimeout์ ์ฌ์ฉํจ
let timerId = setInterval(() => alert('์งธ๊น'), 2000); */
let timerId = setTimeout(function tick() {
alert('์งธ๊น');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
์ค์ฒฉ setTimeout
์ setInterval
๋ณด๋ค ์ ์ฐํ๊ฒ ์๋๋ฉ๋๋ค. ํธ์ถ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ ํธ์ถ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์กฐ์ ํด ์ค์ผ์ค๋งํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
5์ด ๊ฐ๊ฒฉ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด ๋ฐ์ดํฐ๋ฅผ ์ป๋๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๊ณผ๋ํ ์์ฒญ์ผ๋ก ์ธํด ์๋ฒ๊ฐ ๊ณผ๋ถํ ์ํ๊ฐ ๋๋ค๋ฉด ์์ฒญ ๊ฐ๊ฒฉ์ ์ฆ๊ฐ์์ผ์ฃผ๋ ๊ฒ์ด ์ข์ ๊ฒ๋๋ค.
let delay = 5000;
let timerId = setTimeout(function request() {
...์์ฒญ ๋ณด๋ด๊ธฐ...
if (์๋ฒ ๊ณผ๋ถํ๋ก ์ธํ ์์ฒญ ์คํจ) {
// ์์ฒญ ๊ฐ๊ฒฉ์ ๋๋ฆฝ๋๋ค.
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๋ง๋ค ์คํํฉ๋๋ค.
ํจ์์ ํจ์์ ์คํ์ฌ์ด์ ๋น ์ ์ด ์ง์ฐ์๊ฐ์
๋๋ค.setInterval
๊ณผ setTimeout
์ ์ง์ฐ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๊ณ ์์ต๋๋ค.
์ฆ, setInterval
์ ์ฌ์ฉํ๋ฉด func
ํจ์ ํธ์ถ ์ฌ์ด์ ์ง์ฐ ๊ฐ๊ฒฉ์ด ์ค์ ๋ช
์ํ ๊ฐ๊ฒฉ์ธ 100ms ๋ณด๋ค ์งง์์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ func
์ ์คํํ๋๋ฐ ์๋ชจ๋๋ ์๊ฐ๋ ์ง์ฐ ๊ฐ๊ฒฉ์ ํฌํจ์ํค๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ฝ func
์ ์คํํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ช
์๋ ์ง์ฐ ๊ฐ๊ฒฉ์ธ 100ms๋ณด๋ค ๋ ๊ธธ๋ค๋ฉด ์์ง์ func
์ด ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ค์ผ์ค๋ฌ๋ฅผ ํ์ธ ํ ์ง์ฐ ์๊ฐ์ด ์ค๋ฒ๋์ผ๋ฉด ๋ค์ ํธ์ถ์ ๋ฐ๋ก ์์ํฉ๋๋ค.
์ค์ฒฉ setTimeout
์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ช
์๋ ์ง์ฐ ์๊ฐ(100ms)์ด ๋ณด์ฅ๋ฉ๋๋ค.
์ด์ ํจ์์ ์คํ์ด ์ข
๋ฃ๋ ์ดํ์ ๋ค์ ํจ์ ํธ์ถ์ ๋ํ ๊ณํ์ด ์ธ์์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๊ธฐ ์๊ฐ์ด 0์ธ setTimeout
setTimeout(func, 0)
์ด๋ setTimeout(func)
์ ์ฌ์ฉํ๋ฉด setTimeout
์ ๋๊ธฐ์๊ฐ์ 0์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๋๊ธฐ ์๊ฐ์ด 0์ผ๋ก ์ค์ ๋๋ฉด func
์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์คํํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋จ, ์ด๋ ์ค์ผ์ค๋ฌ๋ ํ์ฌ ์คํ ์ค์ธ ์ค์ผ์ค ์ฒ๋ฆฌ๊ฐ ์ข
๋ฃ๋ ์ดํ์ ์ค์ผ์ค๋งํ ํจ์๋ฅผ ์คํํฉ๋๋ค.
์ด๋ฐ ํน์ง์ ์ด์ฉํด ํ ์ค์ผ์ค์ด ์ข
๋ฃ๋ ์งํ ์ํ๋ ํจ์๋ฅผ ์คํํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
setTimeout(() => console.log("World"));
console.log("Hello");
์ ์ฝ๋๋ ์ฝ์์ Hello
๊ฐ ๋จผ์ ์ถ๋ ฅ๋ ํ World
๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.World
๋ฅผ ์ถ๋ ฅํ๋ ํจ์๋ ๋๊ธฐ์๊ฐ 0์ ๊ฐ์ ธ ๋ฐ๋ก ๋ฉ์์ง ํ๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ดํ ์ฝ์์ Hello
๊ฐ ์ถ๋ ฅ๋๋ ํจ์๊ฐ ์ฝ ์คํ์ ์ถ๊ฐ๋๊ณ ์ด ํจ์๊ฐ ๋จผ์ ์คํ๋ฉ๋๋ค.
์ดํ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฝ ์คํ์ด ๋น์ด์๋ ๊ฒ์ ํ์ธํ ํ ๋ฉ์์ง ํ์ ๋ด๊ฒจ์๋ World
์ถ๋ ฅ ํจ์๋ฅผ ์ฝ ์คํ์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ ํ World
ํจ์๊ฐ ์คํ๋๊ฒ ๋ฉ๋๋ค.
requestAnimationFrame
Javascript์์ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ new Date()
๋ฅผ ์ฌ์ฉํ ํ์ด๋จธ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ ๋๋ฉ์ด์
์ ์์ ์ง์ ๊ณผ ์ข
๋ฃ ์์ ์ ๋ณ์์ ์ ์ฅํด ๋ฐ๋ณต์ ์ผ๋ก ์คํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ์ฝ ์คํ์ด ์ง๋์น๊ฒ ๋ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
์ด๋ requestAnimationFrame()
ํจ์๊ฐ ํ์ํฉ๋๋ค.
requestAnimationFrame
ํจ์๋ ๋ฐ๋ณตํ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.requestAnimationFrame
ํจ์์ ์ฅ์
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์ ๋ฐ ๋นํ์ฑํ ์ ์ค์ง
- ์ต๋ 1ms๋ก ์ ํ๋๋ฉฐ 1์ด์ 60๋ฒ ๋์
- ๋ค์์ ์ ๋๋ฉ์ด์ ์๋ ๋์ผํ ํ์ด๋จธ๋ฅผ ์ฐธ์กฐ
// requestAnimationFrame ์์
!(function() {
let start = new Date().getTime()
let i = 1
let counting = function() {
let ts = new Date().getTime()
if (ts - 1000 > start) {
// console.log('End');
} else {
console.log(i++, ts)
requestAnimationFrame(counting)
}
}
requestAnimationFrame(counting)
})()
์ ์ฝ๋๋ 1์ด ๋์ counting
ํจ์๊ฐ 60๋ฒ๊น์ง๋ง ์คํ๋๊ณ ์ข
๋ฃ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฝ ์คํ์ด ๋ง์์ง๋ ํ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
requestAnimationFrame
ํจ์๋ฅผ ์ทจ์ํ๊ธฐ ์ํด์๋ cancelAnimationFrame
ํจ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
let requestId = requestAnimationFrame(() => console.log('Hello World!'))
cancelAnimationFrame(requestId)
์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ธ
'๐ฅ Front-End > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ (0) | 2022.07.19 |
---|---|
[JS] JavaScript์ append๋ฅผ ์ด์ฉํ HTML ์์ ์์ฑํ๊ธฐ (0) | 2022.05.15 |
[JS] 8. IIFE & ๋ชจ๋ & ๋ค์์คํ์ด์ค (0) | 2022.04.18 |
[JS] 7. ํํ์ & ๋ฌธ (0) | 2022.04.17 |
[JS] ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Dive - ์ฐ์ฐ์ (0) | 2022.04.07 |