Rolf B: Wie Variable als Argument einer Funktion übergeben?

Beitrag lesen

Hallo Helgor,

nein, so macht man das nicht. Das Sammelobjekt ist ja auch wieder global. Damit verlagerst Du nur das Problem von der Timeout-Variablen auf das Sammelobjekt.

Die Idee ist, eine Closure zu benutzen (Erklärungen im SelfWiki).

Und eigentlich möchtest Du doch setInterval verwenden, um setTimeout nicht immer wieder neu aufrufen zu müssen, oder?

function runRinseNRepeat(stopButton) {
   const intervalTimer = setInterval(rubRubDubDub, 1000);

   stopButton.addEventListener("click", 
      () => {
         console.log("Clean!!!");
         clearInterval(intervalTimer);
   });

   function rubRubDubDub() {
      console.log("With a rub rub rub and a dub dub dub in the water in the water...");
      // do Work
   }
}

// somewhere else
runRinseNRepeat(document.getElementById("stopDenWahnsinn"));

Die vom Click-Handler und von rubRubDubDub gebildeten Closures teilen sich den Scope von runRinseNRepeat und können damit auch nach Ende dieses Funktionsaufrufs darauf zugreifen.

Je nachdem, wie dein übriger Code aussieht, reicht das hin. Aber wenn runRinseNRepeat nun eine globale Funktion ist, dann ist das Problem, den globalen Fußabdruck zu vermeiden, immer noch nicht gelöst. Das geht aber, und zwar, wenn Du runRinseNRepeat zu einer IIFE machst:

(function(stopButton) {
  const intervalTimer = setInterval(rubRubDubDub, 1000);

  stopButton.addEventListener("click", () => {
      console.log("Clean!!!");
      clearInterval(intervalTimer);
    });

  function rubRubDubDub() {
    console.log("With a rub rub rub and a dub dub dub in the water in the water...");
    // do Work
  }
})(document.getElememtById("stopDenWahnsinn"));

Ob Du document.getElememtById("stopDenWahnsinn") nun als Parameter in die IIFE hineingibst oder es drinnen direkt einbaust, ist Geschmackssache oder mag auch an anderen Rahmenbedingungen hängen. Du kannst auch nur die ID hineingeben.

Natürlich kannst Du das, wenn Du es unbedingt willst, auch mit setTimeout lösen. In rubRubDubDub ist die intervalTimer-Variable genauso verfügbar. Du musst dann nur let statt const verwenden...

Rolf

--
sumpsi - posui - obstruxi