Hans-Peter Rieger: Rekursive Funktion legt PC lahm

Beitrag lesen

Hallo JavaScript-Experten,

wenn man glaubt, man hat so ziemlich alles mal erlebt, was man so erleben kann, dann passiert folgendes: Es wird eine rekursive JavaScript-Funktion verwendet zum Erstellen einer Explorer-ähnlichen Navigation.

Der Effekt: Wenn das Ganze (a) auf dem heimischen IIS läuft, hängt sich die Funktion in der ersten Rekursions-Schleife auf, die CPU-Auslastung steigt auf 100 % und die Speichernutzung (lt. Task-Manager) läuft gegen die obere Grenze. Es wird also permanent Speicher allokiert. Baut man dagegen (b) als erste Zeile zu Test-Zwecken ein alert("pieps!") ein, funktioniert die Funktion tadellos. Lade ich die Funktion (incl. ihrer HTML-Datei) auf einen IIS ins Internet, läuft die Funktion in jedem Fall tadellos (also auch ohne alert). Woran - um alles in der Welt - kann das liegen ?

Die Funktion (zur Information):

function funDrawBranch (iBegEntry, iLevel, sPrev, iSelected)
{  var j;
   iSave[iLevel] = i  ;                          // save actual loop counter value
   for (i = iBegEntry; i <= mD.length; i++)      // partial loop over menu entries
   {  if (mD[i].type == "root")
      {  filMenuFile.write ("<img src="" + mD[i].oicon + "" align=top>");
         filMenuFile.write (mD[i].etext + "<br>\n");
      }
      if (mD[i].prev == sPrev)
      {  for (j = 1; j <= (iLevel - 1); j++)
         {  if (iHigherIcon[j] == 101)  {  filMenuFile.write ("<img src="Branch_101c.gif" align=top>");  }
            if (iHigherIcon[j] == 000)  {  filMenuFile.write ("<img src="Empty.gif"       align=top>");  }
         }
         if (mD[i].type == "folder")
         {  if (mD[i].open == true)
            {  if (mD[i].tail == true)  {  filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(false, " + i + ")"><img src="Branch_110m.gif" align=top border=0></a>");  }
               else                     {  filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(false, " + i + ")"><img src="Branch_111m.gif" align=top border=0></a>");  }
                                           filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(false, " + i + ")"><img src="" + mD[i].oicon + "" align=top border=0></a>");
                                           filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(false, " + i + ")">" + mD[i].etext + "</a><br>\n");
               if (mD[i].tail == true)  {  iHigherIcon[iLevel] = 000;  }
               else                     {  iHigherIcon[iLevel] = 101;  }
               funDrawBranch (i+1, iLevel+1, mD[i].name, iSelected);
            }
            else
            {  if (mD[i].tail == true)  {  filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(true, " + i + ")"><img src="Branch_110p.gif" align=top border=0></a>");  }
               else                     {  filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(true, " + i + ")"><img src="Branch_111p.gif" align=top border=0></a>");  }
                                           filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(true, " + i + ")"><img src="" + mD[i].cicon + "" align=top border=0></a>");
                                           filMenuFile.write ("<a href="javascript:parent.LounFrame.funFolder(true, " + i + ")">" + mD[i].etext + "</a><br>\n");
            }
         }
         if (mD[i].type == "leaf")
         {  if (mD[i].tail == true)     {  filMenuFile.write ("<img src="Branch_110c.gif" align=top>");  }
            else                        {  filMenuFile.write ("<img src="Branch_111c.gif" align=top>");  }
                                           filMenuFile.write ("<img src="" + mD[i].oicon + "" align=top>");
            if (i == iSelected)         {  filMenuFile.write ("<a href="" + mD[i].url + "" target="" + mD[i].tframe + "">" + mD[i].etext + "</a><br>\n");    }
            else                        {  filMenuFile.write ("<a href="" + mD[i].url + "" target="" + mD[i].tframe + "">" + mD[i].etext + "</a><br>\n");    }
         }
      }
   }
   i = iSave[iLevel];
}                                                // end of ... function

Ciao
Hans-Peter