๐กโโ๐กโโ๐กโโ๐ก
โโโโโโโโโ๐ก
๐ ์ฌ์ ์ ์๋ฏธ : ๊ธฐ๊ณ์ ์ค์์น ์ผ์๋ ํฐ์น ์ผ์ ๋ฑ์ ๋ค๋ฃฐ ๋, ์๊ฐ์ ์ผ๋ก ์ค์์น์ ์ ์ ์์ ON/OFF๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋๋ ํ์(debouncing)์ ์์ ๋ ๊ฒ
๐ป ํ๋ก๊ทธ๋๋ฐ์ ์๋ฏธ : ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ํน์ ์๊ฐ์ด ์ง๋ ํ, ํ๋์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์
โ๏ธ ์ฌ์ฉ ์์) ํค๋ณด๋ ์
๋ ฅ ์ด๋ฒคํธ์ ์ฃผ๋ก ์ฌ์ฉ
๐ฌ ๊ตฌํ ๋ฐฉ๋ฒ : ์ด๋ฒคํธ๊ฐ ์คํ๋์์ ๋ ์ผ์ ์๊ฐ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ด๋ฒคํธ๋ฅผ ์ํํ๋๋ก ๋ง๋ค๊ณ , ์ผ์ ์๊ฐ ๋ด์ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ ๋ค์ด์ค๋ฉด ์ด์ ์์ฒญ์ ์ทจ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
function debounce(callback, delay) {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
callback.apply(this, arguments)
}, delay)
}
}
๐กโโ๐กโโ๐กโโ๐ก
โโโโ๐กโโโโ๐ก
๐ ์ฌ์ ์ ์๋ฏธ : ๋ชฉ์ ์กฐ๋ฅด๋ ํ์. ์ถ๋ ฅ์ ์กฐ์ ํ๋ค๋ ์๋ฏธ๋ ์์ด ๋ฐธ๋ธ๋ฅผ ์กฐ์ ํ๋ ๊ณผ์ ์์๋ ์ด ๋จ์ด๊ฐ ์ฌ์ฉ๋๋ค.
๐ป ํ๋ก๊ทธ๋๋ฐ์ ์๋ฏธ : ์ผ์ ์๊ฐ๋์ ์ผ์ด๋ ์ด๋ฒคํธ๋ฅผ ๋ชจ์ 1๋ฒ๋ง ์คํํ๋ ๊ธฐ์
โ๏ธ ์ฌ์ฉ ์์) scroll, mousemove ์ด๋ฒคํธ์ ์ฃผ๋ก ์ฌ์ฉ
๐ฌ ๊ตฌํ ๋ฐฉ๋ฒ : ํ์ด๋จธ๊ฐ ์์ ๊ฒฝ์ฐ ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ , ํ์ด๋จธ๊ฐ ์์ ๊ฒฝ์ฐ ์๋ฌด๋ฐ ๋์๋ ํ์ง ์๋๋ก ํ์ฌ ์ผ์ ์๊ฐ ์ดํ์ ์ด๋ฒคํธ๊ฐ 1๋ฒ ์คํ๋๋๋ก ๊ตฌํํ๋ค.
function throttle(callback, delay) {
let timer;
return function () {
if(!timer) {
timer = setTimeout(() => {
callback.apply(this, arguments)
}, delay)
}
}
}
๋์ ์ฐจ์ด๋ Throttle์ ๊ฒฝ์ฐ ์ผ์ ์๊ฐ๋ง๋ค ์ด๋ฒคํธ๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ค๋ ๊ฒ์ด๊ณ , Debounce๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ด๋ค. ํ์ด์ ์ค๋ช
ํด๋ณด๋ฉด, Debounce๋ ์ผ์ ์๊ฐ ๋ด์ ๋ค์ ์ด๋ฒคํธ๊ฐ ์คํ๋ ๊ฒฝ์ฐ ํ์ด๋จธ๊ฐ ์ด๊ธฐํ ๋์ด ๋ค์ ์ผ์ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ฆฌ์ง๋ง, Throttle์ ์ด๋ฒคํธ๊ฐ ๋ค์ ์คํ๋๋ ๊ฒ๊ณผ๋ ์๊ด ์์ด ์ผ์ ์๊ฐ๋ง๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Throttle์ ๊ฒ์์ด ์
๋ ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ '๋ฒจ๋ก๊ทธ'
๋ผ๋ ๋จ์ด๋ฅผ ๊ฒ์ ์ ํ์ด๋จธ์ ์๊ฐ์ด ์งง์ ๊ฒฝ์ฐ ๋ฒ , ๋ฒจใน,๋ฒจ๋ก๊ทธ
์ด๋ฐ ์์ผ๋ก '๋ฒจ๋ก๊ทธ'๋ผ๋ ๊ฒ์์ด ์
๋ ฅ์ ๋ํด ์ฌ๋ฌ ๋ฒ ์ด๋ฒคํธ๊ฐ ์คํ๋๊ฒ ๋๋ค. ๊ทธ๋์ ์ค๊ฐ ์ค๊ฐ ๊ฒฐ๊ณผ์ ๋ํ ์ด๋ฒคํธ๋ ๋ฐ์์ํค๊ธธ ์ํ ๋์๋ Throttle์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
๋ ๊ธฐ์ ์ด ํท๊ฐ๋ฆฐ๋ค๋ฉด ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ฉด ์ข๋ค. ๋์ ์ฐจ์ด๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
๋๋ฐ์ด์ค(Debounce)์ ์ค๋กํ(Throttle ) ๊ทธ๋ฆฌ๊ณ ์ฐจ์ด์
debounce๋ throttle๋ ํด๋ก์ (Closure) ํจ์๋ก, ๋ด๋ถ์ ์ต๋ช ํจ์๋ ์์ ์ ํฌํจํ๊ณ ์๋ ์ธ๋ถํจ์์ ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
ํด๋ก์ ์์ ์ฝ๋
function outer() {
var x = 1;
var inner = function () { console.log(x); };
return inner;
}
var test = outer();
test(); // 1
์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ธ๋ถํจ์ outer
๋ ํธ์ถ๋์ด ๋ด๋ถํจ์์ธ inner
๋ฅผ test
๋ณ์์ returnํ๊ณ call stack์์ ์ ๊ฑฐ๋๊ฒ ๋๋ค. call stack์์ ์ ๊ฑฐ๋์๊ธฐ ๋๋ฌธ์ inner
ํจ์์์ ์ฐธ์กฐํ๊ณ ์๋ outer
๋ด๋ถ ๋ณ์ x
์ ๊ฐ์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง ์์ ๊ฒ์ด๋ผ ์๊ฐํ ์ ์์ง๋ง, ์ถ๋ ฅ ๊ฒฐ๊ณผ x
๊ฐ์ด ์ ์์ ์ผ๋ก ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๊ฒ์ ํด๋ก์ ํจ์์ ํน์ฑ ๋๋ฌธ์ผ๋ก ์ธ๋ถ ํจ์๊ฐ ์ข
๋ฃ๋ ์ดํ์๋ ๋ด๋ถ ํจ์์ธinner
ํจ์๊ฐ ์ ์ธ๋์์ ๋์ ํ๊ฒฝ์ ๊ธฐ์ตํ์ฌ ์์ ์ ๋ ์์ปฌ ์ค์ฝํ ๋ด์ ๋ณ์/ํจ์ ๋ฑ์ ์ฐธ์กฐํ ์ ์์๋ ๊ฒ์ด๋ค.
ํจ์์ ์ค์ฝํ๋ ํจ์๋ฅผ ํธ์ถํ ๋๊ฐ ์๋ ์ ์ธํ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ๋๋๋ฐ, ์ด๋ฅผ ๋ ์์ปฌ ์ค์ฝํ(lexical scoping) ์ด๋ผ๊ณ ํ๋ค.
์ด๋ฅผ debounce ์ฝ๋์ ์ ์ฉํด์ ์ค๋ช ํด๋ณด๋ฉด,
function debounce(callback, delay) {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
callback.apply(this, arguments)
}, delay)
}
}
debounce ๋ด๋ถ์ ์ต๋ช
ํจ์๋ debounce ๋ด์์ ์ ์ธ๋์์ผ๋ฏ๋ก ์ต๋ช
ํจ์์ ์์ ์ค์ฝํ๋ debounce ํจ์๊ฐ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ต๋ช
ํจ์๋ ์์ ์ด ์ํ ๋ ์์ปฌ ์ค์ฝํ ๋ด์ ๋ณ์/ํจ์ ๋ฑ์ ์ฐธ์กฐํ ์ ์๊ฒ๋๊ณ , ํจ์๊ฐ ์ ์ธ ๋์์ ๋น์๋ฅผ ๊ธฐ์ตํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํจ์๊ฐ ์ข
๋ฃ๋ ์ดํ์๋ ๋ด๋ถ์ ์ต๋ช
ํจ์๋ timer
๋ณ์์ ์ ๊ทผ ํ ์ ์๊ฒ ๋๋ค.
debounce ๋ด์ ํจ์๋ ์ฝ๋ฐฑํจ์ ํํ๋ก ๋ด๋ถ์์ this ๋ฐ์ธ๋ฉ์ ์ํ apply๊ฐ ์ฌ์ฉ๋๊ณ ์๋ค. ์ฝ๋ฐฑ ํจ์์ ๋ํ ์ดํด๋ ์ฝ๋ฐฑํจ์ ํฌ์คํ ์ ์ ๋ฆฌํด๋์๋ค.
debounce์ throttle์ ์ง์ ๊ตฌํํ ์๋ ์์ง๋ง lodash๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
lodash๋ ์ฑ๋ฅ์ด ๋ณด์ฅ๋ ๋ค์ํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ฐธ๊ณ
Debounce, Throttling
๋๋ฐ์ด์ค(Debounce)์ ์ค๋กํ(Throttle ) ๊ทธ๋ฆฌ๊ณ ์ฐจ์ด์
ํด๋ก์