molily: anonyme Funktionen mit variablem Parameter im Schleifendurchlauf

Beitrag lesen

for(var i = 1; i <= p_total; i++)
  {
    document
      .getElementById('wl' + i)
      .addEventListener('click', function() {an_aus(i);}, false);
  }

Und an diesem Punkt bin ich grad mit meinem Latein am Ende.

So funktionieren Closures – sie konservieren das Variablen-Objekt der äußeren Funktion und erlauben somit den Zugriff auf diese Variablen über die Scope-Chain. Sie konservieren jedoch nicht auf den aktuellen Wert, den die Variablen zum Zeitpunkt der Erzeugung der Closure hatten.

Wie erreiche ich, das bei dem Schleifendurchlauf zu dem Zeitpunkt der anonymen Funktion bei der Übergabe des Parameter „i“ auch jeweils der Laufzeitwert von „i“ übergeben und nicht der Endwert von „i“?

Das könnte man mit einer weiteren Funktion lösen, bei sich der Wert von i nicht ändert:

function registriereHandler (i) {  
  document  
    .getElementById('wl' + i)  
    .addEventListener('click', function() {  
      // Hier drin können wir sicher sein, dass i den korrekten, gleich bleibenden Wert hat  
      an_aus(i);  
    }, false);  
}  
  
for (var i = 1; i <= p_total; i++) {  
  registriereHandler(i);  
}

Das ist hinsichtlich Laufzeit-Performance und Speicherverwendung aber alles andere als optimal.

Da du ohnehin schon die Zahl am Element speicherst, würde ich stattdessen die an_aus-Funktion umschreiben und die Zahl aus der ID extrahieren:

.addEventListener('click', an_aus, false);

und dann

function an_aus () {  
  var nr = [link:http://molily.de/js/event-handling-objekt.html#currenttarget-target@title=this].id.match(/\d+$/)[0]; // aus "asdf123" wird "123"  
  if (!nr) return;  
  document.getElementById('pk' + nr).style.display = "none";  
  document.getElementById('pl' + nr).style.display = "block";  
}

Mathias