Таймер так и делается, там всё просто:
var timeout;
function timer(){
//действия
timeout = setTimeout(timer, 1000);
}
//запуск
timer();
//остановка
clearTimeout(timeout);
С clearTimeout'ом ничего проскочить нельзя, т.к. если clearTimeout произведён то никаких вызовов точно не будет. Главное правило чтоб не накосячить - одновременно на одну задачу должен существовать только один таймер, следующий не должен вызываться пока предыдущий не закончится.
А вот как раз таки setInterval использовать не рекомендуется(только в особых случаях), т.к. он имеет свойство в случае лагов накапливаться, и может случиться так, что он уже очищен, а функция продолжает вызываться.)