Если нам нужно отменить запуск setTimeout или setInterval, то обычно используем такую конструкцию:
const timeoutId = setTimeout(() => {}, 100);
clearTimeout(timeoutId);
Основное неудобство в запоминании timeoutId, но можно сделать ф-цию обертку, которая позволит нам избавиться от timeoutId:
function timer(cb, timeout) {
const timeoutId = setTimeout(cb, timeout);
return () => clearTimeout(timeoutId);
}
const destroyTimer = timer(()=> {}, 1000);
destroyTimer();
За счет сохранения timeoutId внутри функции за счет замыкания, нам можно забыть о timeoutId
Такой же трюк можно провернуть и с EventListener: