Maksimal størrelse af opkaldsstapel overskredet fejl

Jeg bruger en Direct Web Remoting (DWR)-JavaScript-biblioteksfil og får kun en fejl i Safari (desktop og iPad)

Der står

Maksimal størrelse af call stack overskredet.

Hvad betyder denne fejl helt præcist, og stopper den behandlingen helt?

Også nogen rettelse til Safari browser (Faktisk på iPad Safari, står der

JS:execution exceeded timeout

hvilket jeg antager er det samme problem med call stack)

Løsning

Det betyder, at du et eller andet sted i din kode kalder en funktion, som igen kalder en anden funktion osv., indtil du når grænsen for call stack-grænsen.

Dette skyldes næsten altid en rekursiv funktion med en base case, der ikke bliver opfyldt.

Visning af stakken

Overvej denne kode...

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

Her er stakken efter en håndfuld kald...

Som du kan se, vokser stakken af opkald, indtil den rammer en grænse: browserens hardcodede stakstørrelse eller udtømning af hukommelsen.

For at løse det skal du sikre dig, at din rekursive funktion har et grundtilfælde, som kan opfyldes...

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

Du kan nogle gange få dette, hvis du ved et uheld importerer/indlejrer den samme JavaScript-fil to gange, og det er værd at tjekke det i fanen Ressourcer i inspektøren.

Kommentarer (6)

Der er en rekursiv løkke et sted i din kode (dvs. en funktion, der til sidst kalder sig selv igen og igen, indtil stakken er fuld).

Andre browsere har enten større stakke (så du får en timeout i stedet) eller også sluger de fejlen af en eller anden grund (måske en dårligt placeret try-catch).

Brug debuggeren til at tjekke call stack'en, når fejlen opstår.

Kommentarer (3)