Felet Maximal storlek på anropsstacken överskrids

Jag använder en Direct Web Remoting (DWR) JavaScript-biblioteksfil och får ett fel endast i Safari (dator och iPad).

Det står

Maximal storlek på anropsstacken överskrids.

Vad exakt betyder detta fel och stoppar det bearbetningen helt och hållet?

Finns det någon lösning för webbläsaren Safari (På iPad Safari står det faktiskt följande

JS:exekvering överskred timeout

vilket jag antar är samma problem med anropsstacken)

Lösning

Det betyder att du någonstans i din kod anropar en funktion som i sin tur anropar en annan funktion och så vidare, tills du når gränsen för anropsstacken.

Detta beror nästan alltid på en rekursiv funktion med ett basfall som inte uppfylls.

Visa stacken

Tänk på den här koden...

(function a() {
    a();
})();

Här är stacken efter en handfull anrop...

Som du kan se växer anropsstapeln tills den stöter på en gräns: webbläsarens hårdkodade stackstorlek eller att minnet är uttömt.

För att åtgärda detta bör du se till att din rekursiva funktion har ett basfall som kan uppfyllas...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
Kommentarer (16)

Det kan ibland hända att du får detta om du råkar importera/embedja samma JavaScript-fil två gånger, vilket är värt att kontrollera på fliken Resurser i inspektören.

Kommentarer (6)

Det finns en rekursiv slinga någonstans i din kod (dvs. en funktion som så småningom anropar sig själv igen och igen tills stacken är full).

Andra webbläsare har antingen större stackar (så att du får en timeout i stället) eller så sväljer de felet av någon anledning (kanske en dåligt placerad try-catch).

Använd felsökaren för att kontrollera anropsstacken när felet uppstår.

Kommentarer (3)