Prekročenie maximálnej veľkosti zásobníka volaní

Používam súbor knižnice JavaScript Direct Web Remoting (DWR) a dostávam chybu iba v prehliadači Safari (počítač a iPad)

Hovorí to

Prekročená maximálna veľkosť zásobníka volaní.

Čo presne táto chyba znamená a zastaví sa úplne spracovanie?

Tiež nejaká oprava pre prehliadač Safari (V skutočnosti na iPad Safari, píše

JS:execution exceeded timeout

čo predpokladám, že je rovnaký problém so zásobníkom volaní)

Riešenie

To znamená, že niekde v kóde voláte funkciu, ktorá následne volá ďalšiu funkciu a tak ďalej, až kým nenarazíte na limit zásobníka volaní.

Takmer vždy je to spôsobené rekurzívnou funkciou so základným prípadom, ktorý nie je splnený.

Zobrazenie zásobníka

Zoberme si tento kód...

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

Tu je zásobník po niekoľkých volaniach...

Ako vidíte, zásobník volaní rastie, kým nenarazí na limit: pevne nastavenú veľkosť zásobníka prehliadača alebo vyčerpanie pamäte.

Aby ste to napravili, zabezpečte, aby vaša rekurzívna funkcia mala základný prípad, ktorý je schopný splniť...

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

Niekedy sa vám to môže stať, ak omylom importujete/vložíte ten istý súbor JavaScriptu dvakrát, čo sa oplatí skontrolovať na karte zdrojov v inšpektore.

Komentáre (6)

Niekde vo vašom kóde sa nachádza rekurzívna slučka (t. j. funkcia, ktorá sa nakoniec volá znova a znova, kým sa zásobník nezaplní).

Iné prehliadače majú buď väčšie zásobníky (takže namiesto nich sa zobrazí timeout), alebo z nejakého dôvodu chybu pohltia (možno zle umiestnený try-catch).

Pomocou ladiaceho programu skontrolujte zásobník volaní, keď dôjde k chybe.

Komentáre (3)