ํ์ด๋จธ
ํธ์ถ ์ค์ผ์ค๋ง
- ํจ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ์ง ์๊ณ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผ๋ ์ดํ์ ํธ์ถ์ ์์ฝํ๋ ๊ฒ์ ํธ์ถ ์ค์ผ์ค๋ง ์ด๋ผ ํจ
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์ด๋จธ ํจ์๋ฅผ ์ ๊ณต
- ํ์ด๋จธ ์์ฑ ํจ์ :
setTimeout
,setInterval
- ํ์ด๋จธ ์ ๊ฑฐ ํจ์ :
clearTimeout
,clearInterval
- ํ์ด๋จธ ์์ฑ ํจ์ :
- ํ์ด๋จธ ํจ์๋
ECMAScript
์ฌ์์ ์ ์๋ ๋นํธ์ธ ํจ์๊ฐ ์๋๋ค. - Node.js ํ๊ฒฝ์์ ์ ์ญ ๊ฐ์ฒด์ ๋ฉ์๋ ์ฆ, ํธ์คํธ ๊ฐ์ฒด
- ํ์ด๋จธ ํจ์๋ฅผ ์ฌ์ฉํด ์์ฑํ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๋ ๋์ ๋ฐฉ์
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฑ๊ธ ์ค๋ ๋(
single thread
)๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ํ์ด๋จธ ํจ์setTimeout
,setInterval
์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ๋์ ํ๋ค.
ํ์ด๋จธ ํจ์
setTimeout/ clearTimeout
setTimeout
ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฝ๋ฐฑ ํจ์, ๋๋ฒ์งธ ์ธ์๋ก ์๊ฐ, ์ ๋ฌํด์ผ ํ ์ธ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ธ๋ฒ ์งธ ์ธ์๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉ- ์ ๋ฌ ๋ฐ์ ์๊ฐ์ผ๋ก ๋จ ํ ๋ฒ ๋์ํ๋ ํ์ด๋จธ๋ฅผ ์์ฑํ๊ณ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์ ํธ์ถ(ํ๋ฒ ์คํ)
// 1์ด(1000ms) ํ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๋ค.
setTimeout(() => console.log('Hi!'), 1000);
// 1์ด(1000ms) ํ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๋ค.
// ์ด๋ ์ฝ๋ฐฑ ํจ์์ 'Lee'๊ฐ ์ธ์๋ก ์ ๋ฌ๋๋ค.
setTimeout(name => console.log(`Hi! ${name}.`), 1000, 'Lee');
// ๋ ๋ฒ์งธ ์ธ์(delay)๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ 0์ด ์ง์ ๋๋ค.
setTimeout(() => console.log('Hello!'));
setTimeout
์ ์์ฑ๋ ํ์ด๋จธ๋ฅผ ์๋ณํ ์ ์๋ ๊ณ ์ ํ ํ์ด๋จธ id๋ฅผ ๋ฐํ- ํ์ด๋จธ id๋ฅผ
clearTimeout
ํจ์์ ์ธ์๋ก ์ ๋ฌํ์ฌ ํ์ด๋จธ๋ฅผ ์ทจ์ํ ์ ์๋ค.
const timerId = setTimeout(() => console.log('excute call back'), 1000);
// clearTimeout์ผ๋ก ์ทจ์ํ๋ฉด setTimeout์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋์ง ์๋๋ค.
clearTimeout(timerId);
setInterval / clearInterval
setInterval
ํจ์์ ์ ๋ฌํ ์ธ์๋setTimeout
๊ณผ ๋์ผํฉ๋๋ค.- ์ฒซ ๋ฒ์งธ ์ธ์ ์ฝ๋ฐฑ ํจ์, ๋๋ฒ์งธ ์ธ์ ์๊ฐ, ์ ๋ฌํ ์ธ์๊ฐ ์๋ค๋ฉด ์ธ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ
setInterval
ํจ์๋ ์ ๋ฌ ๋ฐ์ ์๊ฐ์ผ๋ก ๋ฐ๋ณต ๋์ํ๋ ํ์ด๋จธ๋ฅผ ์์ฑํฉ๋๋ค.- ์ฆ, ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋ ๋๋ง๋ค ์ ๋ฌ ๋ฐ์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์คํ ๋จ
- ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ ์ ํ ํ์ด๋จธ id๋ฅผ ๋ฐํํ๋ฉฐ
clearInterval
๋ก ์ทจ์ ๊ฐ๋ฅ
let count = 1;
// 1์ด(1000ms) ํ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋ ๋๋ง๋ค ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๋ค.
// setInterval ํจ์๋ ์์ฑ๋ ํ์ด๋จธ๋ฅผ ์๋ณํ ์ ์๋ ๊ณ ์ ํ ํ์ด๋จธ id๋ฅผ ๋ฐํํ๋ค.
const timeoutId = setInterval(() => {
console.log(count); // 1 2 3 4 5
// count๊ฐ 5์ด๋ฉด setInterval ํจ์๊ฐ ๋ฐํํ ํ์ด๋จธ id๋ฅผ clearInterval ํจ์์
// ์ธ์๋ก ์ ๋ฌํ์ฌ ํ์ด๋จธ๋ฅผ ์ทจ์ํ๋ค. ํ์ด๋จธ๊ฐ ์ทจ์๋๋ฉด setInterval ํจ์์ ์ฝ๋ฐฑ ํจ์๊ฐ
// ์คํ๋์ง ์๋๋ค.
if (count++ === 5) clearInterval(timeoutId);
}, 1000);
๋๋ฐ์ด์ค์ ์ค๋กํ
scroll
,resize
,input
,mousemove
๊ฐ์ ์ด๋ฒคํธ๋ ์งง์ ์๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ์ฌ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๊ณผ๋ํ๊ฒ ํธ์ถ๋์ด ์ฑ๋ฅ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.- ๋๋ฐ์ด์ค์ ์ค๋กํ์ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด์ ๊ณผ๋ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ํธ์ถ์ ๋ฐฉ์งํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
๋๋ฐ์ด์ค (debounce
)
- ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐ์ํด์ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ง ์๋ค๊ฐ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ ๋ฒ๋ง ํธ์ถ ๋๋๋ก ํ๋ค.
์ฆ, ๋๋ฐ์ฐ์ค๋ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํ ํด์ ๋ง์ง๋ง์ ํ ๋ฒ๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋๋ก ํ๋ค.
- ๊ตฌํ ์์
const debounce = (callback, delay) => {
let timerId;
// debounce ํจ์๋ timerId๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค.
return event => {
// delay๊ฐ ๊ฒฝ๊ณผํ๊ธฐ ์ด์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด์ ํ์ด๋จธ๋ฅผ ์ทจ์ํ๊ณ
// ์๋ก์ด ํ์ด๋จธ๋ฅผ ์ฌ์ค์ ํ๋ค.
// ๋ฐ๋ผ์ delay๋ณด๋ค ์งง์ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด callback์ ํธ์ถ๋์ง ์๋๋ค.
if (timerId) clearTimeout(timerId);
timerId = setTimeout(callback, delay, event);
};
};
resize
์ด๋ฒคํธ ์ฒ๋ฆฌ, ์ ๋ ฅ ๊ฐ์ผ๋กajax
์์ฒญ, ๋ฒํผ ์ฃผ์ค๋ณต ํด๋ฆญ ๋ฐฉ์ง ๋ฑ ํ์ฉ ๊ฐ๋ฅ
์ค๋กํ (throttle
)
- ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐ์ํด์ ๋ฐ์ํ๋๋ผ๋ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ต๋ ํ ๋ฒ๋ง ํธ์ถ๋๋๋ก ํ๋ค.
์ฆ, ์ผ์ ์๊ฐ๋จ ๋จ์๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ ๋๋๋ก ํธ์ถ ์ฃผ๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒ
- ๊ตฌํ ์์
const throttle = (callback, delay) => {
let timerId;
// throttle ํจ์๋ timerId๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค.
return event => {
// delay๊ฐ ๊ฒฝ๊ณผํ๊ธฐ ์ด์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋ค๊ฐ
// delay๊ฐ ๊ฒฝ๊ณผํ์ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋ก์ด ํ์ด๋จธ๋ฅผ ์ฌ์ค์ ํ๋ค.
// ๋ฐ๋ผ์ delay ๊ฐ๊ฒฉ์ผ๋ก callback์ด ํธ์ถ๋๋ค.
if (timerId) return;
timerId = setTimeout(() => {
callback(event);
timerId = null;
}, delay, event);
};
};
scroll
์ด๋ฒคํธ ์ฒ๋ฆฌ๋, ๋ฌดํ ์คํฌ๋กค ๊ตฌํ์ ์ฌ์ฉ๋๋ฐ์ด์ค ๋ ์ค๋กํ์ ์ค์ ๋ก ๊ตฌํํ๊ธฐ ๋ณด๋ค๋
Underscore
๋Lodash
์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉ ํจ
'javascript > ๐ study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[10์ฃผ์ฐจ ์คํฐ๋]43์ฅ-Ajax (0) | 2022.04.02 |
---|---|
[์คํฐ๋ 10์ฃผ์ฐจ]42์ฅ- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.04.02 |
[9์ฃผ์ฐจ ์คํฐ๋]40์ฅ-์ด๋ฒคํธ (0) | 2022.03.27 |
[8์ฃผ์ฐจ ์คํฐ๋]39์ฅ-DOM (0) | 2022.03.27 |
[8์ฃผ์ฐจ ์คํฐ๋]38์ฅ-๋ธ๋ผ์ฐ์ ๋ ๋๋ง (0) | 2022.03.27 |
๋๊ธ