Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

11.07.2017, 08:51

Angehangenes Objekt bei Click-Event nicht mehr vorhanden, sondern letztes Objekt des Arrays

Hallo,
ich erzeuge mithilfe von JavaScript dynamisch div-Container. Pro Objekt in einem Array einen Container. Dort befindet sich innerhalb des Containers ein Button mit einem Click-Event. Dieses Event soll zb das Objekt löschen. Jedem Button gebe ich innerhalb der Schleife also das aktuelle Objekt in die Funktion mit.

Erzeuge ich mir 10 Objekte, dementsprechend werden 10 Container erzeugt, klicke nun in der Anwendung auf einen Button, so wird nicht dieses Objekt zerstört, sondern das letzte Objekt im Array. Bei 20 Containern würde also Objekt Nr. 20 zerstört.

Ich habe hier mal zwei Fiddles, einmal mein Problem und einmal die Lösung dafür

das Problem:

https://jsfiddle.net/cmd7ruo5/10/

die Lösung:

https://jsfiddle.net/5bcnq559/4/

Warum ist das so?? Kann mir das jemand erklären? Hängt das mit dem Scope zusammen? Eigentlich werden die Werte doch als Parameter mitgegeben und die Funktion muss sich merken, welches Objekt sie übergeben bekam. ?(

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

2

11.07.2017, 09:19

hier auch nochmal eine alternative Lösung, anstatt var das Schlüsselwort "let" genutzt, damit wird die Variable wohl an den Scope gebunden

https://jsfiddle.net/cmd7ruo5/18/

und hier nochmal eine mögliche Lösung mit IE Support, da ja let dort nicht unterstützt wird.

https://jsfiddle.net/w3guyqf3/3/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Garzec« (11.07.2017, 09:50)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

11.07.2017, 09:53

Warum ist das so??

Ich hab von JavaScript keine Ahnung; aber so wie das aussieht, würde ich mal sagen, dass deine function im ersten Beispiel eine Reference auf das originale i enthält, während beim Function call im zweiten Beispiel eine Kopie des momentanen i erstellt wird...

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

11.07.2017, 10:26

Ja irgendwie so.. :D Aber ich war anfangs doch sehr verwirrt..

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

5

11.07.2017, 10:38

Das liegt daran, dass Closures in JS über Referenzen gelöst werden. Daher bezieht sich jedes i im Click-Handler auf dieselbe variable. Noch dazu erlaubt var eine Mehrfachdeklaration derselben Variable, sprich, der alte Wert wird im For-Loop überschrieben. Durch Verwendung von let wird jedes Mal ein neuer Wert im Speicher abgelegt, die alten Werte bleiben in der jeweiligen Closure erhalten.

Vergiss var, benutze ausschließlich let oder const.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

6

11.07.2017, 11:03

Ja wenn aber doch let nicht vom IE unterstützt wird, ist es ja auch ein wenig blöd, überall let zu nutzen :D Privat ist das kein Thema, aber an der Arbeit bräucht ich dann an let gar nich denken.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

7

11.07.2017, 11:14

Dafür gibt es Transpiler. Abgesehen davon kann IE11 let verwenden. Falls ihr noch ältere Versionen unterstützen müsst, habt ihr mein Beileid.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

8

11.07.2017, 11:50

Ja, also IE8 ist wohl momentan DER Renner bei den Kunden :D Ich wage zu behaupten Windows XP ist grade auch das aktuelle Betriebssystem. Und wenn man dann noch bedenkt, welche Kunden wir bedienen, na dann gute Nacht.

Werbeanzeige