• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Integer kopieren

feuerfuchsuser

New member
Wie geht das?

Code:
	for (var i = 0; i < TabsComms.length; i++)
	{
		TabsComms[i].onclick = function() {alert(i);};
	}

TabsComms ist ein Array mit 3 Verweisen auf DOM-Objekte. Alle alerten beim onclick die 2, weil die i ByRef übergeben wird!

hab' das selbe problem wie der da: http://stackoverflow.com/questions/...teger-variable-in-javascript-anonymous-method

ich check die antwort bloß nicht.

jetzt hab ichs einfach kopiert

Code:
		TabsComms[i].onclick = (function(value) {return function() {return alert(value);}}) (i);
aber hab keine ahnung, wieos es funktioniert und was das bedeutet.
 
Zuletzt bearbeitet:
Das Problem ist, dass die in dem ersten Beispiel i immer auf die selbe Variable bezieht und diese ist deswegen in allen drei Callback-Funktionen gleich.
Die Lösung nutzt Closures: wird eine neue Funktion definiert entsteht auch ein neuer Namensraum. Und da Paramter einer Funktion immer als Kopie übergeben werden wird dies hier genutzt um eine Kopie von i zu erstellen, anstatt einer Referenz auf i.
Mit lodash oder underscore könnte man auch etwas einfacher verständliches machen:
Code:
TabsComms[i].onclick = function() {alert(_.clone(i));};

Und lodash / underscore (selbe API) kann man immer gut gebrauchen ;)
 
Das wird so nicht funktionieren, da das i immer noch nicht seinen eigenen Scope hat... und das _.clone, was bei Primitiven überhaupt gar nicht nötig ist, wird auch erst beim Klicken aufgerufen.

Mit reinem JS kann man das so kürzen:
Code:
TabsComms[i].onclick = alert.bind(window, i);
 
Sorry, mein Fehler. Ich dache man könnte _.clone so missbrauchen :uncomfortableness:

Die Lösung, das Objekt und i an die Funktion zu binden finde ich gut.
 
Zurück
Oben