Wie Variable als Argument einer Funktion übergeben?
bearbeitet von Rolf BHallo 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](https://wiki.selfhtml.org/wiki/JavaScript/Objekte/this#Closures)).
Und eigentlich möchtest Du doch setInterval verwenden, um setTimeout nicht immer wieder neu aufrufen zu müssen, oder?
~~~js
function runRinseNRepeat(stopButton) {
let 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](https://wiki.selfhtml.org/wiki/IIFE) machst:
~~~js
(function(stopButton) {
let 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.
_Rolf_
--
sumpsi - posui - obstruxi
Wie Variable als Argument einer Funktion übergeben?
bearbeitet von Rolf BHallo 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](https://wiki.selfhtml.org/wiki/JavaScript/Objekte/this#Closures)).
Und eigentlich möchtest Du doch setInterval verwenden, um setTimeout nicht immer wieder neu aufrufen zu müssen, oder?
~~~js
function runRinseNRepeat(stopButton) {
let 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](https://wiki.selfhtml.org/wiki/IIFE) machst:
~~~js
(function(stopButton) {
let 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.
_Rolf_
--
sumpsi - posui - obstruxi
Wie Variable als Argument einer Funktion übergeben?
bearbeitet von Rolf BHallo 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.
Und eigentlich möchtest Du doch setInterval verwenden, um setTimeout nicht immer wieder neu aufrufen zu müssen, oder?
~~~js
function runRinseNRepeat(stopButton) {
let 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.
[Mehr Erklärungen im SelfWiki.](https://wiki.selfhtml.org/wiki/JavaScript/Objekte/this#Closures)
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](https://wiki.selfhtml.org/wiki/IIFE) machst:
~~~js
(function(stopButton) {
let 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.
_Rolf_
--
sumpsi - posui - obstruxi