Sebastian Mohr: ?? sind arrays rekursiv uebergebar ??

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

  1. hi,

    ich denke mal, du musst eine indexnummer übergeben, also arr[0]...

    versuch das mal!

    Gruß Oppa

    1. 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

  2. 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

  3. 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