[자바스크립트]

[JavaScript/DeepDive]41.타이머

ki7348 2021. 6. 29. 18:01
  • [41.1] 호출 스케줄링
  • 함수를 명시적으로 호출하면 함수가 즉시 실행된다.
  • 만약 함수를 명시적으로 호출하지 않고 일정 시간이 경과된 이후에 호출되도록 함수 호출을 예약하려면 타이머 함수를 사용한다.
    • 이를 호출 스케줄링이라 한다.
  • 타이머 함수 setTimeout과 setInterval은 모두 일정 시간이 경과된 이후 콜백 함수가 호출되도록 타이머를 생성한다.
    • 다시 말해, 타이머 함수 setTimeout과 setInterval이 생성한 타이머가 만료되면 콜백 함수가 호출된다.
  • 자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖기 때문에 두 가지 이상의 태스크를 동시에 실행할 수 없다.
    • 즉, 자바스크립트 엔진은 싱글스레드로 동작한다.
    • 이런 이유로 타이머 함수 setTimeout과 setInterval은 비동기 처리 방식으로 동작한다.

 

 

 

  • [41.2] 타이머 함수
  • setTimeout/clearTimeout
    • setTimeout 함수는 두 번째 인수로 전달받은 시간으로 단 한번 동작하는 타이머를 생성한다.
    • 이후 타이머가 만료되면 첫 번째 인수로 전달받은 콜백 함수가 호출된다.
    • 즉, setTimeout 함수의 콜백 함수는 두 번째 인수로 전달받은 시간 이후 단 한 번 실행되도록 호출 스케줄링된다.
      • const timeoutId = setTimeout(func|code[, delay, param1, param2, ...]);
  • clearTimeout 함수는 호출 스케줄링 을 취소한다.
  • setInterval/clearInterval
    • setInterval 함수는 두 번째 인수로 전달받은 시간으로 반복 동작하는 타이머를 생성한다.
    • 이후 타이머가 만료될 때마다 첫 번째 인수로 전달받은 콜백 함수가 반복 호출된다.
    • 이는 타이머가 취소될 때까지 계속된다.
    • 즉, setInterval 함수의 콜백 함수는 두 번째 인수로 전달받은 시간이 경과할 때마다 반복 실행되도록 호출 스케줄링된다.
    • setInterval 함수에 전달할 인수는 setTimeout 함수와 동일하다.
      • const timerId = setInterval(func|code[, delay, param1, param2, ...]);
    • clearInterval 함수는 호출 스케줄링을 취소한다.

 

 

 

  • [41.3] 디바운스와 스로틀
  • 디바운스와 스로틀은 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해서 과도한 이벤트 핸들러의 호출을 방지하는 프로그래밍기법이다.
  • 디바운스
    • 디바운스는 짧은 시간 간격으로 이벤트가 연속해서 발생하면 이벤트 핸들러를 호출하지 않다가 일정 시간이 경과한 이휴에 이벤트 핸들러가 한 번만 호출되도록 한다.
    • 즉, 디바운스는 짧은 시간 간격으로 발생하는 이벤트를 그룹화해서 마지막에 한 번만 이벤트 핸들러가 호출되도록 한다.
  • 스로틀
    • 스로틀은 짧은 시간 간격으로 이벤트가 연속해서 발생하더라도 일정 시간 간격으로 이벤트 핸들러가 최대 한 번만 호출되도록 한다.
    • 즉, 스로틀은 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해서 일정 시간 단위로 이벤트 핸들러가 호출되도록 주기를 만든다.