함수를 명시적으로 호출하지 않고 일정 시간이 경과된 후 함수가 호출되도록 함수 호출을 예약하는 것을 호출 스케줄링이라고 합니다.
자바스크립트는 타이머를 생성할 수 있는 타이머 함수인 setTimeout, setInterval 그리고 타이머를 제거할 수 있는 clearTimeout, clearInterval 함수를 제공합니다. 타이머 함수는 브라우저와 Node.js 환경에서 제공되는 호스트 객체로 전역 객체의 메서드로 제공됩니다.
setTimeout 함수는 일정 시간이 경과된 후 인수로 전달한 콜백 함수를 단 한 번만 호출하고, setInterval 함수는 일정 시간이 경과될 때마다 인수로 전달한 콜백 함수가 반복 호출됩니다.
setTimetout 함수는 두 번째 인수로 전달한 시간(밀리초, ms단위)가 경과되면 첫 번째 인수로 전달한 콜백 함수를 태스크 큐에 푸시합니다. 세 번째 인수 이후에 전달한 값은 콜백 함수의 인수로 전달됩니다
setTimeout(func | code, delay [, param1, param2, ...]);
첫 번째 인수로 콜백함수 대신 코드 문자열을 전달할 수도 있습니다. 코드 문자열을 전달하는 경우 타이머가 만료된 이후에 해석되고 실행되므로 권장하지 않습니다.
주의할 점은 두 번째 인수로 전달한 시간이 4ms 이하인 경우 최소 지연 시간인 4ms로 설정됩니다. 생략시 기본값은 0이 설정됩니다.
setTimeout 함수를 호출하면 타이머를 식별할 수 있는 타이머 ID를 반환합니다. 브라우저 환경에서는 숫자 타입이고, Node.js 환경에서는 객체 타입입니다. 이 타이머 ID는 clearTimeout 함수의 인수로 전달하면 타이머를 제거합니다. 즉, clearTimeout 함수는 호출 스케줄링을 취소합니다.
setInterval(func | code, delay [, param1, param2, ...]);
function debounce(callback, delay) {
let timerId;
return event => {
if (timerId) clearTimeout(timerId);
timerId = setTimeout(callback, delay, event);
};
}
function throttle(callback, delay) {
let timerId;
return event => {
if (timerId) return;
timerId = setTimeout(event => {
callback(event);
timerId = null;
},delay,event);
};
}