JavaScript Schleife in einer Schleife aufrufen führt zur endlos Schleife

RedGunPanda

Commander
Dabei seit
Dez. 2010
Beiträge
2.702
Hallo zusammen,
nachdem ich jetzt etliche meiner Haare verloren habe (nun fast eine Glatze) hab ich mein Problem lösen können, indem ich aus i iy gemacht habe.

Ich habe zwei Funktionen geschrieben welche jeweils durch eine for Schleife laufen. Das heißt:

Funktion 1 wird aufgerufen und zählt durch ein Array. Bestandteil der Schleife in Funktion 1 ist der Aufruf von Funktion 2, welche ebenfalls durch eine Schleife läuft und durch ein weiteres Array zählt. Beide for Schleifen hatten i als Variable angegeben um entsprechend bei erreichen des Wertes die Funktion zu verlassen.

Nun habe ich 2 Stunden gebraucht um im Endeffekt aus dem i in Funktion 1 ein iy zu machen und es geht :freak:. Kann mir jemand den Hintergrund erklären? Warum setzt Funktion 2 mein i in Funktion 1 zurück? Das war schließlich laut Konsole immer 1. Es macht ja auch irgendwo Sinn, dass das so nicht funktioniert, aber warum nicht. Gibt es dafür eine verständliche Erklärung?

​Danke im Voraus!
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
38.995
Du hast vergessen die Variablen vorher mittels "var i;" zu deklarieren, damit sie als lokale Variable existiert. Dadurch geht der Suchalgorithmus von JavaScript der keine entsprechende lokale Variable findet in seiner Objekthirarchie nach oben du legt schlussendlich "i" als Member beim Hauptobjekt (this) an, was im Browser üblicherweise "window" ist. Das ist aber in beiden Funktionen das selbe Objekt und somit schreiben beide Funktionen in das selbe "i" und überschreiben sich gegenseitig die Werte (das ganze ist dadurch quasi eine globale Variable)
 

SchiBuh

Lt. Junior Grade
Dabei seit
Dez. 2014
Beiträge
307
Das liegt am sogenannten Scope in Javascript.
 

firexs

Admiral
Dabei seit
Nov. 2003
Beiträge
9.726
Ist in mehreren Programmiersprachen so, das es Globale und Lokale Variablen gibt. Jeder Teilabschnitt (Funktion) kann sich zB. an einer Globalen Variablen bedienen, deren Wert einmalig festgelegt wird, oder den Wert durch eine vorherige Funktion übernimmt.

Eine lokale Variable ist dazu gedacht, dass deren Wert die Funktion nie verlässt.
 

RedGunPanda

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2010
Beiträge
2.702
Das war mir schon bewusst, mit den globalen und nicht globalen Variablen. Auch mit Scope arbeite ich des öfteren und auch this is geläufig aber irgendwie bin ich über die letzten Stunden auch wirklich blind geworden. Wenn es einfach nicht funktioniert und man nicht herausbekommt warum verzweifelt man irgendwann. :freak:

Jetzt ist aber alles klar, danke für die aufschlussreiche Hilfe! :)
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
38.995
Wobei man bei JavaScript aufpassen muss das die Variablen dann nicht pauschal "global" sind wie in Programmiersprachen die so etwas haben. Sie werden am this Objekt erzeugt das zwar meistens das globale Hauptobjekt ist, aber nicht immer (in dem Fall muss man für den Zugriff auf solche "Variablen" das window.i explizit schreiben).

JavaScript hat schon so seine ganz speziellen Eigenheiten... ist halt eine hybrid Sprache mit Konzepten sowohl aus den funktionalen Sprachen als auch prototypischer Objektorientierung (aus letzterer stammt auch das verhalten Member an Objekten dynamisch erzeugen zu können). Das ist für einige Überraschungen gut ;-)
 

pmkrefeld

Captain
Dabei seit
Feb. 2012
Beiträge
3.259
Einfach am Anfang der js Datei folgendes Anfügen:

Code:
'use strict';
Dann sollte schon die IDE meckern wenn man das var vergisst.
 
Top