setInterval의 경우 setTimeout을 언급해야 합니다. 둘 다 특정 기능을 정기적으로 실행하는 데 사용됩니다. 차이점은 setTimeout은 한 번만 실행되는 반면 setInterval은 연속적으로 실행될 수 있다는 것입니다.
function do_sth() { console.log('Hello...'); }
setTimeout(do_sth, 2500); // 2.5 秒后,执行 do_sth 函数(只执行一次) setInterval(do_sth, 3500); // 3.5 秒后,执行 do_sth 函数(每隔 3.5 秒执行一次,一直执行下去)
겉보기에는 둘 다 각자의 용도가 있으며 문제가 없습니다. 그러나 setInterval에 의해 실행되는 함수가 시간이 많이 걸리는 작업인 경우 setInterval은 이전 차단에 관계없이 원래 계획에 따라 해당 함수를 계속 호출합니다. 이러한 방식으로 시간이 지남에 따라 실행을 기다리는 함수의 수가 늘어납니다. 대기열이 더 많아집니다. 이 문제에 대한 해결책은 다음과 같이 setTimeout을 재귀적으로 호출하는 것입니다.
function do_sth() { console.log('Hello...'); // 即使这里执行比较耗时的动作也没问题, // 等这里执行完了才会再去调用 setTimeout setTimeout(do_sth, 2500); // 安排后续执行 } do_sth(); // 初次执行
이 재귀 호출 방법은 루프에서 특정 기능을 실행하는 목적을 달성할 수 있을 뿐만 아니라 후속 작업이 누적되는 것을 방지할 수도 있습니다.
이 방법이 좀 장황하다고 생각되시면 좀 더 간결하게 써주셔도 됩니다.
(function() { console.log('Hello...'); // do something here setTimeout(arguments.callee, 2500); })();
그렇지만 예약 실행 작업 비용이 적다면 일반적으로 setInterval은 문제가 되지 않지만, 작업 비용이 상대적으로 높다면 반드시 setTimeout을 사용하세요.