728x90
1. 호출 스케줄링
호출 스케줄링
- 함수를 명시적으로 호출하면 함수가 즉시 실행됨
- 호출 스케줄링 : 함수를 명시적으로 호출하지 않고 일정 시간이 경과된 후 호출되도록 함수 호출을 예약하는 것
- 타이머 함수 사용
타이머 함수
- 타이머 함수는 ECMAScript 사양에 정의된 빌트인 함수가 아님
- 하지만 브라우저 환경과 Node.js 환경에서 모두 전역 객체의 메서드로서 타이머 함수 제공 => 타이머 함수는 호스트 객체
- 타이머 함수는 모두 일정시간 경과된 이후 콜백 함수가 호출되도록 타이머 생성 => 타이머 함수가 생성한 타이머가 만료되면 콜백함수 호출
- setTimeout 함수가 생성한 타이머 : 단한번 동작
- setInterval 함수가 생성한 타이머 : 반복 동작
setTimeout, setInterval은 비동기 처리 방식
- 자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖기 때문에 두가지 이상의 태스크 동시 실행 불가
- 자바스크립트는 싱글 스레드로 동작 => setTimeout, setInterval은 비동기 처리 방식으로 동작
2. 타이머 함수
a. setTimeout / clearTimeout
- setTimeout 함수는 두번째 인수로 전달받은 시간(ms, 1/1000초)으로 단 한번 동작하는 타이머 생성
- 이후 타이머가 만료되면 첫번째 인수로 전달받은 콜백함수가 호출
- setTimeout 함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id 반환
- setTimeout 함수가 반환한 타이머 id는 브라우저 환경인 경우 숫자이며 Node.js 환경인 경우 객체
- setTimeout 함수가 반환한 타이머 id를 clearTimeout 함수의 인수로 전달해 타이머 취소 가능
b. setInterval / clearInterval
- setInterval 함수는 두번째 인수로 전달받은 시간 (ms, 1/1000초)으로 반복 동작하는 타이머 생성
- 이후 타이머가 완료될때마다 첫번째 인수로 전달받은 콜백 함수가 반복 호출되며 타이머가 취소될때 까지 반복
- setInterval 함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id 반환
- setInterval 함수가 반환한 타이머 id는 브라우저 환경인 경우 숫자이며 Node.js 환경인 경우 객체
- setInterval 함수가 반환한 타이머 id를 clearInterval 함수의 인수로 전달해 타이머 취소 가능
3. 디바운스와 스로틀
- scroll, resize, input, mousemove 같은 이벤트는 짧은 시간 간격으로 연속해서 발생
- 이러한 이벤트에 바인딩한 이벤트 핸들러는 과도하게 호출되어 성능에 문제 줄 수 있음
- 디바운스, 스로틀 : 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해 과도한 이벤트 핸들러의 호출 방지하는 프로그래밍 기법
- 디바운스와 스로틀은 이벤트 처리할 때 매우 유용
- 디바운스와 스로틀 구현에는 타이머 함수가 사용됨
a. 디바운스
디바운스
- 디바운스 : 짧은 시간 간격으로 이벤트가 연속해서 발생하면 이벤트 핸들러를 호출하지 않다가 일정 시간이 경과한 이후에 이벤트 핸들러가 한번만 호출되도록 함
- 짧은 시간 간격으로 발생하는 이벤트를 그룹화해서 마지막에 한번만 이벤트 핸들러가 호출되도록 함
- 디바운스는 resize 이벤트 처리, Input 요소에 입력된 값으로 ajax 요청하는 입력 필드 자동완성 UI 구현, 버튼 중복 클릭 방지 처리 등에 유용하게 사용
- 실무에서는 Underscore의 debounce 함수나 Lodash의 debounce 함수 사용
디바운스 예시
- input 이벤트는 사용자 텍스트 입력 필드에 값을 입력할 때마다 연속해서 발생
- 만약 input의 이벤트 핸들러에서 사용자가 입력 필드에 입력한 값으로 Ajax 요청과 같은 무거운 처리를 수행한다면 사용자가 아직 입력을 완료하지 않았어도 Ajax 요청 전송
- 사용자가 입력을 완료했는지 여부를 정확히 알 수 없으므로 일정 시간 동안 텍스트 입력 필드에 값을 입력하지 않으면 입력이 완료된 것으로 간주
- 이를 위해 debounce 함수가 반환한 함수는 debounce 함수에 두번째 인수로 전달한 시간(delay)보다 짧은 간격으로 이벤트가 발생하면 이전 타이머를 취소하고 새로운 타이머 재설정
- 따라서 delay보다 짧은 간격으로 이벤트가 연속해서 발생하면 debounce 함수의 첫번째 인수로 전달한 콜백함수는 호출되지 않다가 delay 동안 input 이벤트가 더이상 발생하지 않으면 한번만 호출
b. 스로틀
스로틀
- 스로틀 : 짧은 시간 간격으로 이벤트가 연속해서 발생하더라도 일정 시간 간격으로 이벤트 핸들러가 최대 한번만 호출되도록 함
- 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해서 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출 주기를 만듦
- scroll 이벤트 처리나 무한 스크롤 UI 구현 등에 유용
- 실무에서는 Underscore의 throttle 함수나 Lodash의 throttle 함수 사용
스로틀 예시
- scroll 이벤트는 사용자가 스크롤할 때 짧은 시간 간격으로 연속해서 발생함
- 이처럼 짧은 시간 간격으로 연속해서 발생하는 이벤트의 과도한 이벤트 핸들러의 호출을 방지하기 위해 throttle 함수는 이벤트를 그룹화해 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출주기를 만듦
- throttle 함수가 반환한 함수는 throttle 함수에 두번째 인수로 전달한 시간(delay)이 경과하기 이전에 이벤트가 발생하면 아무것도 하지 않다가 delay 시간이 경과했을 때 이벤트가 발생하면 콜백 함수를 호출하고 새로운 타이머 재설정 => delay 시간 간격으로 콜백 함수 호출
모던 자바스크립트 딥다이브 책을 정리한 내용입니다!!
728x90
'개념 정리 > 모던 자바스크립트 딥다이브' 카테고리의 다른 글
모던 자바스크립트 : REST API (1) | 2023.12.11 |
---|---|
모던 자바스크립트 : Ajax (0) | 2023.12.08 |
모던 자바스크립트 : DOM part 2 (0) | 2023.12.07 |
모던 자바스크립트 : 비동기 프로그래밍 (0) | 2023.12.06 |
모던 자바스크립트 : DOM (1) | 2023.12.06 |