JavaScript Rekursive Funktion "Out of Memory" od. "Too many Recursions"

hurga_gonzales

Captain
Registriert
Aug. 2004
Beiträge
3.343
Hi,

hab da mal ein kleines Problem mit meiner Zufallsfunktion mit Rekursion. Bei nachfolgendem Code sollte meiner Meinung nach die Rekursion funktionieren, liefert aber im IE einen Alert mit "Out of Memory on line #n" und dementsprechend im FF "Too many Recursions".

Javascript Funktion
Code:
<script language="javascript" type="text/javascript">
	<!--
		function changeOpac(b, c) {
			for (i=1; i<=4; i++) {
				document.getElementById("b" + i).className = 'nopac';
			}
			document.getElementById(b).className = 'opac';
				if (!c) {
					var min = 1;
					var max = 4;
					var pos = Math.floor(Math.random() * (max - min + 1)) + min;
					setTimeout(changeOpac('b' + pos, 0), 2000);
				}
		}
	-->
	</script>

Und der Aufruf im Fuß der Seite mittels:
Code:
<script language="javascript" type="text/javascript">
		<!--
			var min = 1;
			var max = 4;
			var pos = Math.floor(Math.random() * (max - min + 1)) + min;
			setTimeout(changeOpac('b' + pos, 0), 2000);
		-->
		</script>

Das Skript im Fuß der Seite aktiviert die Rekursion im oberen Skript. Die Variable "c" ist nur dazu da, die automatische Rekrusion bei einem manuellen Mouseover über ein bestimmtes Element innerhalb der Seite zu unterbrechen.

Hilfe wäre toll. Danke
Hurga
 
Du solltest mal dringend lernen, wie Rekursion funktioniert.
Irgendwann muss auch mal eine Abbruchbedingung erfüllt sein.

Tip: Buch
 
Hallo, danke.

Und da ich kein Javascript-Meister wie Ihr bin, möchte ich um die von Euch genannte Abbruchbedingung bitten. Wie und wo muss ich die einbauen?

Danke
Hurga
 
ich hab von Javascript überhaupt keine Ahnung (das ist doch keine richtige Programmiersprache^^), aber was soll die Rekursion denn überhaupt bewirken? Eine billige Abbruchbedingung wäre z.B. eine Maximaltiefe. Dies könnte man dadurch realisieren, indem man noch einen Parameter mehr der Methode changeOpac übergibt, welche zählt, um welche Rekursionsebene es sich handelt. Bei jedem geschachtelten Aufruf wird dieser Wert um 1 erhöht und nicht aufgerufen, falls der Wert ein Limit übersteigt.


function changeOpac(b, c, limit) {
for (i=1; i<=4; i++) {
document.getElementById("b" + i).className = 'nopac';
}
document.getElementById(b).className = 'opac';
if (!c) {
var min = 1;
var max = 4;
var pos = Math.floor(Math.random() * (max - min + 1)) + min;
if(limit < 10) setTimeout(changeOpac('b' + pos, 0), 2000, limit+1);
}
}



noch eine kleine Frage: was macht denn "c"? Der Wert wird der Methode changeOpac übergeben (2000) und dann abgefragt: (!c) ... was soll denn ein "not c" zurückliefern? vielleicht eher "!=c", aber dann sollte man c nicht immer 2000 zuweisen.
 
Das, was Du da machst ist keine echte Rekursion. Deswegen funzt das auch so erstmal nicht.
(und der Abbruch fehlt natürlich auch)
So wies aussieht, versuchst Du Elemente ein/auszublenden.
Dazu gibt es doch viele einfache Beispiele, warum versuchst Du es nicht mit sowas?
http://brainerror.net/scripts/javascript/blendtrans/

-- -- muckelzwerg
 
Zurück
Oben