?? sind arrays rekursiv uebergebar ??
Sebastian Mohr
- javascript
0 Oppa0 Ed X0 Antje Hofmann
wenn ihr diesen code mal unten ausfuehrt, werdet wahrscheinlich
auch auf die fehlermeldung stossen: "'a' is undefined". nun weiss
trotz diverser online referenzen bzw. skripten immer noch nicht
warum.
-------------------------
var Id, timeout=200;
function test(start,arr){
if(start==(arr.length-1)){
window.clearTimeout(Id);
alert('fertig');}
else{
alert("test("+start+","+arr+")");
start++;
Id = window.setTimeout("test("+start+","+arr+")",timeout);}}
function testit(){
var arr = new Array('a','b','c','d');
test(0,arr);}
-------------------------
ps: ausserdem wuerde mich mal interessieren, warum setTimeout
nicht in iterativen schleifen funktioniert. zb. bei einer
for-schleife macht sich der timeout nur gesamten bemerkbar.
so denn, bin gespannt
hi,
ich denke mal, du musst eine indexnummer übergeben, also arr[0]...
versuch das mal!
Gruß Oppa
ich denke mal, du musst eine indexnummer übergeben, also arr[0]...
nicht so wirklich. und ausserdem wollte ich ja auch das ganze array
uebergeben. ich meine bei der funktion "testit" funktionierts ja auch
mit der argumenten uebergabe; sprich also warum nicht in einer
rekursion? --> trotzdem danke fuer den versuch
Hallöle;
"'a' is undefined"
so richtig klar ist mir das auch nicht, vor allem warum er sich auf
"a" bezieht, welches der _Wert_ des ersten arrayelements ist.
Aber das deine Funktion so nicht funktioniert ist eigentlich klar.
var Id, timeout=200;
function test(start,arr){
if(start==(arr.length-1)){
window.clearTimeout(Id);
alert('fertig');}
else{
alert("test("+start+","+arr+")");
vor allem hier wird alert gebeten den Rückgabewert von test()
auszugeben. Welcher ist das eigentlich?
start++;
Id = window.setTimeout("test("+start+","+arr+")",timeout);}}
hier wir die funktion dan nochmal, wieder rekursiv aufgegeben
es stellt sich für mich die Frage, was willst du eigentlich auf dem
Bildschirm sehen?
function testit(){
var arr = new Array('a','b','c','d');
test(0,arr);}
Arrays kann man sehr wohl auch in rekursiven funtionen übergeben:
In abwandlung deines konstrukts:
-------------------------------
function test(arr) {
if(arr.length==1) {
alert('fertig');
} else {
alert(arr);
test( arr.slice(1,arr.length) );
}
}
function testit() {
var arr = new Array('a','b','c','d','e','f');
test(arr);
}
--------------------------------
ps: ausserdem wuerde mich mal interessieren, warum setTimeout
nicht in iterativen schleifen funktioniert. zb. bei einer
for-schleife macht sich der timeout nur gesamten bemerkbar.
nun, wie willst du denn setTimeout auf eine For-schleife anwenden, es
geht eigentlich nur für funktionen. Für iterative Kontrollmechanismen
ist in JS keine "Bremse" vorgesehen.
bye eddie
Hallo Sebastian
wenn ihr diesen code mal unten ausfuehrt, werdet wahrscheinlich
auch auf die fehlermeldung stossen: "'a' is undefined". nun weiss
trotz diverser online referenzen bzw. skripten immer noch nicht
warum.
Eine gute Frage :-) und ich versuche mal zu helfen.
setTimeout bewirkt keine Unterbrechung des Programmablaufes, eine Funktion warten gibt es in JavaScript nicht. setTimeout bewirkt lediglich, dass der innerhalb des Methodenaufrufes notierte Programmcode verzögert ausgeführt wird (das beantwortet deine PS-Frage). Bis zum Einsetzen des Timeouts werden alle weiteren Programmzeilen abgearbeitet.
setTimeout wurde eingeführt mit der JavaScript-Version 1.0. In dieser Version setTimeout(expression, msec) muss expression immer ein String sein. Genau diese Art der Übergabe versuchst du innerhalb deiner Funktion.
Im ersten Aufruf wird der Funktion ein Array als Argument übergeben.
Id = window.setTimeout("test("+start+","+arr+")",timeout);}}
in dieser Zeile setzt du per Stringaddition den Übergabewert zusammen.
arr ist ein Array. Dieses Array wird automatisch zu einem String konvertiert und sieht so aus: a,b,c,d. Nach Ablauf der gewünschten Zeitspanne sieht der Funktionsaufruf so aus:
test(1,a,b,c,d)
die Variablen a,b,c,d existieren jedoch nicht. Damit kommt es zur Fehlermeldung und dem Abbruch des Ablaufes.
Ab JavaScript-Version 1.2 gibt es die Möglichkeit eine Funktion aufzurufen:
setTimeout(function, msec[, arg1[, ..., argN]])
Als optionalen Parameter kann man im Netscape und Mozilla (und nur in diesen Browsern!) Argumente übergeben.
Dein Aufruf würde dann so aussehen:
Id = window.setTimeout(test,timeout,start,arr);
Zu beachten ist hier, dass nach der Funktion keine Klammern folgend dürfen. In dieser Notation ist es möglich, Objekte zu übergeben.
Zu schade, das Opera und IE dies nicht unterstützen. Da du Arrays hast, kann man dieses Problem verhältnismäßig leicht umgehen.
Notiere am Anfang der Funktion diese Zeile:
arr=arr.toString().split(",");
oder alternativ:
if (typeof arr == "string") arr=arr.split(",");
Die erste Variante wandelt den Parameter arr in einen String und erzeugt über split() ein Array. Das toString() ist notwendig, um sicherzustellen, dass die Methode wirklich auf ein Stringobjekt anwendet wird.
Die zweite Variante prüft, ob der Parameter vom Typ string ist und wendet gegebenenfalls die Methode split() darauf an.
Dann brauchst du nur noch diese Zeile
Id = window.setTimeout("test("+start+","+arr+")",timeout);
ändern in:
Id = window.setTimeout("test("+start+",'"+arr+"')",timeout);
Die einfachen Anführungsstriche sorgen dafür, dass folgende
ausführende Zeile entsteht:
test(1,'a,b,c,d')
Damit hast du einen String, den du in ein Array umwandeln kannst. Voraussetzung ist jedoch, dass im Array keine Objekte gespeichert sind.
Als weitere Möglichkeit steht dir noch die Verwendung von globalen Variablen offen. D.h. du verzichtest auf die Parameter und wertes globale Variablen aus.
Viele Grüße
Antje