JSFiddle - React, Tailwind, and code Playground

HTML

<div id="out1">10</div>

<button onclick="window.timer1.stop();return false;">stop</button>
<button onclick="window.timer1.start();return false;">start immediately</button>
<button onclick="window.timer1.start(3000);return false;">start with 3 second delay</button>

JavaScript

function interval(duration, fn, delay){
    this.timer = null;
    this.duration = duration;
    this.fn = fn;
    
    this.start(delay);
}
interval.prototype.start = function(delay){
    if (this.timer) {return;}
    var self=this;
    this.timer = setTimeout(function(){ self.run(); }, delay||0);
};
interval.prototype.run = function(called){
    var self = this,
        nextTick = called ? this.duration - (new Date - called) : 0;
    
    this.timer = setTimeout(function(){
        self.fn();
        self.run(new Date);
    }, nextTick<0 ? 0 : nextTick);
};
interval.prototype.stop = function(){
    clearTimeout(this.timer);
    this.timer = null;
};

window.onload = function() {
    var cnt1 = 10;
    var delay1 = 5;
    window.timer1 = new interval(1000, function(){
        document.getElementById('out1').innerHTML=cnt1;
        cnt1 = cnt1 === 1 ? 10 : cnt1-1;
    }, delay1*1000);
};