일정 시간 전에 이벤트가 발생하게 되면, 기존의 타이머를 취소하고 시간을 재설정하여 이벤트 호출을 방지하고, 일정 시간이 경과된 후에 이벤트 핸들러가 호출되도록 한다.
이벤트 핸들러는 일정 시간이 경과한 후에 발생한 이벤트에 대해서만 최대 한 번만 호출된다.
과도한 이벤트 핸들러 호출을 방지하기 위해, 일정 시간 전에 발생한 이벤트에 대해서는 이벤트 핸들러가 호출되지 않는 호출 주기를 만든다.
짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해서 일정 시간 간격으로 이벤트 핸들러를 호출한다.
기본적으로 디바운스와 스로틀은 다음과 같은 이점을 위해 사용된다.
등 이벤트 핸들러 호출이 한 번만 필요할 때 유용
등 일정 시간을 기준으로 이벤트 핸들러가 호출되어야 하는 상황에 유용
디바운스와 스로틀을 직접 구현할 수도 있지만 불안전하다. 라이브러리를 사용하여 보다 편리하고 안전하게 사용할 수 있다.
1) CDN URL을 사용
- 하단의 CDN URL을 script 태그의 src 속성값으로 넣어주면 된다.
<script src="..."></script>
https://cdn.jsdelivr.net/npm/underscore@1.13.2/underscore-umd-min.js
https://cdn.jsdelivr.net/npm/underscore@1.13.2/underscore-esm-min.js
https://unpkg.com/underscore@1.13.2/underscore-umd-min.js
https://unpkg.com/underscore@1.13.2/underscore-esm-min.js
https://pagecdn.io/lib/underscore/1.13.2/underscore-umd-min.js
https://pagecdn.io/lib/underscore/1.13.2/underscore-esm-min.js
https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.2/underscore-umd-min.js
https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.2/underscore-esm-min.js
2) Package installation
Node.js: npm install underscore
Meteor.js: meteor add underscore
Bower: bower install underscore
3-1) Monolithic Import (recommended)
ESM import _, { map } from 'underscore';
AMD require(['underscore'], ...)
CommonJS var _ = require('underscore');
ExtendScript #include "underscore-umd.js"
3-2) Modular Import
ESM import map from 'underscore/modules/map.js'
AMD require(['underscore/amd/map.js'], ...)
CommonJS var map = require('underscore/cjs/map.js');
1) Installation
<script src="lodash.js"></script>
<script src="..."></script>
https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js
https://cdn.jsdelivr.net/npm/lodash@4.17.21/_arrayFilter.js
https://cdn.jsdelivr.net/npm/lodash@4.17.21/_arrayReduce.js
$ npm i -g npm
$ npm i --save lodash
// Load the full build.
var _ = require('lodash');
나는 debounce와 setTimeout 모두 일정 시간이 경과했을 때, 한 번만 호출한다고 생각해서 비슷하다고 생각했다.
stackoverflow에서 비슷한 질문을 찾을 수 있었는데 결론적으로 둘은 다르다.
우선 debounce는 함수 자체를 반환하고 setTimeout은 함수를 종료시킬 수 있는 id를 반환한다.
const intervalId = setInterval(...)
console.log('setInterval', intervalId)
const timeoutId1 = setTimeout(...)
console.log('setTimeout1', timeoutId1)
const timeoutId2 = setTimeout(...)
console.log('setTimeout2', timeoutId2)
setInterval: 1
setTimeout1: 2
setTimeout2: 3
setInterval: 4
setInterval: 5
setInterval: 6
...
debounce와 throttle은 각각의 콜백 함수를 반환한다.
모던 자바스크립트 Deep Dive (책)
PoiemaWeb - function
Underscore
Lodash
stackoverflow
잘봤습니다 자두님~~