Feil ved overskridelse av maksimal anropsstabelstørrelse

Jeg bruker en Direct Web Remoting (DWR) JavaScript-biblioteksfil og får bare en feil i Safari (desktop og iPad).

Det står

Maksimal anropsstabelstørrelse overskredet.

Hva betyr denne feilen nøyaktig, og stopper den behandlingen helt?

Også enhver løsning for Safari nettleser (faktisk på iPad Safari, står det

JS: utførelse overskredet tidsavbrudd

som jeg antar er det samme anropsstabelproblemet)

Løsning

Det betyr at et eller annet sted i koden din kaller du en funksjon som igjen kaller en annen funksjon og så videre, til du treffer call stack-grensen.

Dette er nesten alltid på grunn av en rekursiv funksjon med en base case som ikke blir oppfylt.

Visning av stakken

Tenk på denne koden...

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

Her er bunken etter en håndfull samtaler...

Som du kan se, vokser anropsstakken til den treffer en grense: nettleserens hardkodede stakkstørrelse eller minneutmattelse.

For å fikse det, sørg for at den rekursive funksjonen din har et grunntilfelle som kan oppfylles ...

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

Du kan noen ganger få dette hvis du ved et uhell importerer/bygger inn den samme JavaScript-filen to ganger, verdt å sjekke i ressursfanen i inspektøren.

Kommentarer (6)

Det er en rekursiv løkke et sted i koden din (dvs. en funksjon som til slutt kaller seg selv igjen og igjen til stakken er full).

Andre nettlesere har enten større stabler (slik at du får en timeout i stedet) eller de svelger feilen av en eller annen grunn (kanskje en dårlig plassert try-catch).

Bruk feilsøkingsprogrammet til å sjekke anropsstakken når feilen oppstår.

Kommentarer (3)