โ ๊ณตํต์
- ์งง์ ์๊ฐ์ ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด์, ๊ณผ๋ํ ์ด๋ฒคํธ ํธ์ถ์ ๋ฐฉ์ง
- ์์ฒญ๋๊ฒ ๋น ๋ฅธ์๋๋ก ํด๋ฆญ์ ์ฌ๋ฌ๋ฒ ํ๊ธฐ
- ๊ฒ์์ฐฝ์ ํค๋ณด๋๋ก ์ ๋ ฅํ๊ธฐ
- ์คํฌ๋กค๋ฐ๋ฅผ ์์๋๋ก ์ญ์ญ ์์ง์ด๊ธฐ
- ์ฐฝ์ ๋ฆฌ์ฌ์ด์งํ๊ธฐ
- ๋ฑ๋ฑ...
โ ๋๋ฐ์ด์ค (Debounce)
- ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ผ์ ์๊ฐ์ ๊ธฐ๋ค๋ฆฐ ํ ์์ฒญ์ ์ํํ๋๋ฐ,
๊ธฐ๋ค๋ฆฌ๋ ๋์ ๊ฐ์ ์์ฒญ์ด ์ถ๊ฐ๋ก ๋ค์ด์ค๋ฉด ์ด์ ์์ฒญ์ ์ทจ์๋จ- ์ฐ์ด์ด์ ํธ์ถ๋๋ ํจ์ ์ค ๊ฐ์ฅ ๋ง์ง๋ง(๋๋ ๊ฐ์ฅ ์ฒ์)๋ง ํธ์ถ ๋๋๋ก ํจ
- ์ผ์์ด ๊ณ~~~์ ํด๋ฆญํ๋ฉด ํด๋ฆญ์ด ๋ฉ์ถ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฉ์ถ๋ฉด ์คํํจ
- ๊ทธ๋์ ๋ง์ฝ ๋ฌดํ ์ ๋ ฅ์ ํ๋ฉด ๋ฌดํ ๊ธฐ๋ค๋ฆผ์ ํจ
- toggle ๋ฒํผ ์ด๋ฒคํธ ๋ฑ์ ์ฃผ๋ฉด ์ข์
function debounce(callback, limit = 100) {
let timeout
return function(...args) {
clearTimeout(timeout)
timeout = setTimeout(() => {
callback.apply(this, args)
}, limit)
}
}
//์คํ
inputDebounce.addEventListener("keyup", debounce(function() {
dispDebounce.textContent = ++debounceCount
}, 100))
์ฝ๋ ์ถ์ฒ : http://yoonbumtae.com/?p=3584
callback
: ์คํ ๋์์ธ ์ฝ๋ฐฑ ํจ์limit
: ์ผ๋ง ํ์ ํจ์๋ฅผ ์คํํ ์ง ๊ฒฐ์ (millisecond)- limit ์ด๋ด์ ํจ์๊ฐ ๋ฐ๋ณต ํธ์ถ ๋ ๊ฒฝ์ฐ
clearTimeout
์คํ →callback
์ด ์คํ๋์ง ์์ - ํจ์์ ๋ฐ๋ณต ํธ์ถ์ด ๋ฉ์ถ ํ์๋
clearTimeout
์คํํ์ง ์์ → limit ๋ฐ๋ฆฌ์ด ํ์callback.apply
์คํ
- limit ์ด๋ด์ ํจ์๊ฐ ๋ฐ๋ณต ํธ์ถ ๋ ๊ฒฝ์ฐ
apply
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์this
์ ๋ฒ์๋ฅผ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋ ๋ ๊ทธ ์ปจํ ์คํธ์this
๋ก ๋ง๋ฌ
โ ์ค๋กํ (Throttle)
- ์ผ์ ์๊ฐ ๋์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ค ๋ชจ์์, ๋จ ํ๋ฒ๋ง ์ํ๋๋๋ก ํจ
- ์ค์ ์๊ฐ์ 1s๋ก ํ๋ฉด, 1์ด ๋์ ์ต๋ 1๋ฒ๋ง ์คํ๋จ
- ์ผ์์ด ๊ณ~~์ ํด๋ฆญํด๋ 1์ด์ 1๋ฒ์ฉ๋ง ์คํ์ด ๋๋ค
- ๋ฌดํ ์ ๋ ฅ์ ํ๋ฉด ์ ๊ธฐ์ ์ผ๋ก ์คํ ํจ
- ๋ฌดํ์คํฌ๋กค(์คํฌ๋กค์ ๋ด๋ฆด ๋ api์์ ์ ๊ธ์ ๋ถ๋ฌ์ด)์ ์ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ์
- ์ฌ์ฉ์๊ฐ ์คํฌ๋กค ๋ด๋ฆฌ๋ ๊ฒ์ ๋ฉ์ถ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ ๋ณด๋ค, ๋ด๋ฆฌ๋ ๋์์๋ ์ชผ๋์ฉ ์ ๊ธ์ ๋ถ๋ฌ์ค๋ ํธ์ด ์ข์ผ๋ฏ๋ก
function throttle(callback, limit = 100) {
let waiting = false
return function() {
if(!waiting) {
callback.apply(this, arguments)
waiting = true
setTimeout(() => {
waiting = false
}, limit)
}
}
}
//์คํ
window.addEventListener("mousemove", throttle(() => {
dispThrottle.textContent = ++mouseThrottleCount
}, 500))
์ฝ๋ ์ถ์ฒ : http://yoonbumtae.com/?p=3584
callback
: ์คํ ๋์์ธ ์ฝ๋ฐฑ ํจ์limit
: ์ผ๋ง ํ์ ํจ์๋ฅผ ์คํํ ์ง ๊ฒฐ์ (millisecond)waiting
:true
์ธ ๊ฒฝ์ฐ if๋ฌธ์ ํ์ง ์์- ์ต์ด ํจ์๊ฐ ํธ์ถ๋ ์, waiting์ false์ด๋ฏ๋ก if๋ฌธ์ ํ → ์ด ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์คํํ ๋ค waiting = true๋ก ๋ฐ๊ฟ
- waiting์ด true๊ฐ ๋์์ ๋, limit๋ฐ๋ฆฌ์ด ํ์ waiting = false๋ก ๋ณ๊ฒฝ๋๋ฉฐ, ์ฝ๋ฐฑํจ์๊ฐ ๋ค์ ์คํ ๋จ
apply
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์this
์ ๋ฒ์๋ฅผ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋ ๋ ๊ทธ ์ปจํ ์คํธ์this
๋ก ๋ง๋ฌ
๐์ฐธ๊ณ (๊ฐ์ฌํฉ๋๋ค)
์๋ฐ์คํฌ๋ฆฝํธ: Debounce, Throttle ์์ ์๋ฐ์คํฌ๋ฆฝํธ (Vanilla JS)๋ก ๊ตฌํ - BGSMM
์ฐธ๊ณ ๊ธ: ์๋ฐ์คํฌ๋ฆฝํธ lodash: debounce์ throttle์ ์ด์ฉํ์ฌ ํจ์์ ์คํ ํ์ ์ ํ debounce: ๋์ผ ์ด๋ฒคํธ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ํ๋๋ ๊ฒฝ์ฐ ๋ง์ง๋ง ์ด๋ฒคํธ๊ฐ ์คํ๋๊ณ ๋์ ์ผ์ ์๊ฐ(๋ฐ๋ฆฌ์ธ์ปจ๋)๋์
yoonbumtae.com
๋๋ฐ์ด์ค์ ์ฐ๋กํ๋ง
scroll, resize, input, mouseover ๋ฑ์ ์ด๋ฒคํธ๋ ์งง์ ์๊ฐ์ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๊ณ , ์ด๋ ์ฑ๋ฅ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. ๋๋ฐ์ด์ค์ ์ฐ๋กํ์ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด
velog.io
Throttle ์ Debounce ๊ฐ๋ ์ ๋ฆฌํ๊ธฐ
Throttle ์ Debounce ๋ผ๋ ๊ฐ๋ ์ ์๊ฒ ๋์ด ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
pks2974.medium.com
https://webclub.tistory.com/607
๋๋ฐ์ด์ค(Debounce)์ ์ค๋กํ(Throttle ) ๊ทธ๋ฆฌ๊ณ ์ฐจ์ด์
Throttle, Debounce & Difference ์ค๋กํ(Throttle) ๊ณผ ๋๋ฐ์ด์ค(Debounce) ๋ ๋ฌด์์ผ๊น? ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ DOM ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฑ๋ฅ์์ ์ด์ ๋ก JS์ ์์ ์ธ ์ธก๋ฉด, ์ฆ ์ด๋ฒคํธ(ev.
webclub.tistory.com
https://medium.com/@kwoncharles/debounce%EC%99%80-throttle%EC%9D%98-%EC%B0%A8%EC%9D%B4-34845fbfa1ff
Debounce์ Throttle์ ์ฐจ์ด
๊ฐ๋จํ ์์ ๋ก ์์๋ณด๋ debounce์ throttle
medium.com
'๐๊ณต๋ถ > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] JS์ ๋ฐ๋ณต๋ฌธ (0) | 2021.11.21 |
---|---|
[JavaScript] var๊ณผ ํธ์ด์คํ (0) | 2021.10.11 |
[JavaScript] Callback vs Promise vs async-await (0) | 2021.10.10 |
[JavaScript] ํ์ดํํจ์ vs ์ผ๋ฐํจ์ (0) | 2021.10.09 |
[JavaScript] window.requestAnimationFrame() (0) | 2021.10.07 |
๋๊ธ