function Slider(config) { var slider = this; this.time = config.time || 3000; this.auto = config.auto || false; // this.slides = document.querySelectorAll(config.slides) || document.querySelectorAll(config.container + ' .slides img'); this.slides = document.querySelectorAll('#slider1 .slides img'); this.nextBtn = document.querySelector(config.nextBtn) || document.querySelector(config.container + ' .controls .next'); this.prevBtn = document.querySelector(config.prevBtn) || document.querySelector(config.container + ' .controls .back'); this.current = config.current || 0; if (slider.auto) { slider.run(); } this.next = function() { slider.slides[slider.current].className = ''; slider.current++; if (slider.current >= slider.slides.length) { slider.current = 0; } slider.slides[slider.current].className = 'visible'; }; this.prev = function() { slider.slides[slider.current].className = ''; slider.current--; if (slider.current < 0) { slider.current = slider.slides.length - 1; } slider.slides[slider.current].className = 'visible'; }; this.run = function() { setInterval(function() { slider.next(); }, slider.time); }; slider.nextBtn.onclick = slider.next; slider.prevBtn.onclick = slider.prev; } new Slider({ container: "#slider1", auto: true, time: 5000 }); 

https://jsfiddle.net/u5xjd6uL/

    1 answer 1

    Because the string this.run = function() { not yet executed.

    Transfer this call to the end of the constructor:

     function Slider(config) { ... if (slider.auto) { slider.run(); } } 
    • yes, I haven’t assigned the value yet, at the end it works thanks - KOSTDM