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

Sithys

Captain
Registriert
Dez. 2010
Beiträge
3.464
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!
 
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)
 
Das liegt am sogenannten Scope in Javascript.
 
Danke, das hilft mir zum Verständnis schon mal weiter. Das heißt ich muss, um es korrekt zu machen (wenn ich das i nicht im Scope haben möchte) i vor jeder Schleife als var deklarieren?
 
Zuletzt bearbeitet:
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.
 
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! :)
 
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 ;-)
 
Einfach am Anfang der js Datei folgendes Anfügen:

Code:
'use strict';

Dann sollte schon die IDE meckern wenn man das var vergisst.
 
Zurück
Oben