
setInterval() 은 일정 시간 간격마다 함수를 실행합니다.
이 메서드는 간격(interval)을 고유하게 식별할 수 있는 interval ID를 반환합니다.
setInterval(() => console.log('setInterval') , 2000); //2초마다 콘솔에 setInterval 출력
setTimeout() 은 일정 시간이 지난 후에 함수를 실행합니다.
이 메서드는 양수 값의 timeoutID를 반환합니다.
setTimeout(() => console.log('setTimeout') , 5000); // 실행 5초 뒤 콘솔에 setTimeout 출력
setTimeout은 비동기 함수이기 때문에 순차적으로 실행되지 않는 경우도 있습니다.
setTimeout(() => {console.log("첫 번째 메시지")}, 5000);
setTimeout(() => {console.log("두 번째 메시지")}, 3000);
setTimeout(() => {console.log("세 번째 메시지")}, 1000);
// 콘솔 출력:
// 세 번째 메시지
// 두 번째 메시지
// 첫 번째 메시지
일정 시간이 지나면 자동으로 닫히는 toast 팝업을 구현해 보았습니다.
버튼을 클릭하여 팝업을 오픈하고, setInterval()로 1초씩 카운트한 후 setTimeout()으로 5초 후에 자동으로 팝업을 닫는 구조입니다.

<button onclick="toastOpen()">Button</button>
<div id="toast" class="hide">
<div>
<span id="sec"></span>초 뒤 자동으로 닫힙니다
</div>
</div>
const toast = document.getElementById('toast'),
sec = document.getElementById('sec');
let i;
function toastOpen() {
toast.classList.remove('hide');
toast.classList.add('show');
toastAutoClose();
}
// 자동으로 닫기
function toastAutoClose() {
i = 5;
count();
setTimeout(() => {
toast.classList.add('hide');
}, `${i}000`);
}
// 초 카운트다운
function count() {
sec.innerText = i;
setInterval(() => {
if (i > 0) {
i--;
sec.innerText = i;
} else {
return
}
}, 1000);
}
버튼을 연속으로 클릭하거나 최초 실행 후 재실행하는 경우,
1초 간격으로 설정해 놓은 setInterval이 더 빠르게 줄어들어버립니다...? 😱

💡 버튼을 클릭했을 때, setInterval 함수 내에서 흐르고 있는 시간을 초기화 시켜보자
setInterval(), setTimeout()을 호출하고 반환받은 값을 clearInterval(), claerTimeout()에 넘겨주면 스케줄링을 취소할 수 있습니다.
clearInterval(식별 ID);
clearTimeout(식별 ID)
let i;
let countSec;
let countdown;
// 자동으로 닫기
function toastAutoClose() {
i = 5;
clearTimeout(countdown);
clearInterval(countSec);
count();
countdown = setTimeout(() => {
toast.classList.add('hide');
}, `${i}000`);
}
// 초 카운트다운
function count() {
sec.innerText = i;
countSec = setInterval(() => {
if (i > 0) {
i--;
sec.innerText = i;
} else {
return
}
}, 1000);
}

버튼을 누를 때마다 setInterval로 시간이 흐르기 전에 초기화(clearInterval)해주기 때문에, 버튼을 연타해도 시간이 1초씩 잘 흘러갑니다!