Как уже говорили другие, идите с # 1. Если вам нужны часы, которые тикают каждую секунду (или минуту, или что-то еще), вы должны оценить время до следующего «тика», чтобы setTimeout вызывалось через несколько мс после нужного времени, например, бежать сразу после следующей секунды:
var d = new Date();
var interval = 1020 - d.getMilliseconds();
setTimeout(fn, interval);
Таким образом, если выполнение одного вызова задерживается из-за занятости системы, следующий вызов все равно должен вызываться через 20 мс после следующей целой секунды.