все дело во вложенной функции (fn), при вызове repeat сработает нижний таймаут в котором эта функция на выполнении, а она уже (функция), выполняет необходимые действия, красит или чего она там делает и плюсует счеткик, а также смотрит, если счетчик меньше чем входящий параметр, запустит саму себя через таймаут опять, и так сколько нужно итераций будет и каждая через разные промежутки