Υπέρβαση του μέγιστου μεγέθους στοίβας κλήσεων σφάλμα

Χρησιμοποιώ ένα αρχείο βιβλιοθήκης JavaScript του Direct Web Remoting (DWR) και λαμβάνω ένα σφάλμα μόνο στο Safari (desktop και iPad)

Λέει

Υπέρβαση του μέγιστου μεγέθους στοίβας κλήσεων.

Τι ακριβώς σημαίνει αυτό το σφάλμα και σταματάει εντελώς η επεξεργασία;

Επίσης, οποιαδήποτε διόρθωση για το πρόγραμμα περιήγησης Safari (Στην πραγματικότητα στο iPad Safari, λέει

JS:execution exceeded timeout

το οποίο υποθέτω ότι είναι το ίδιο πρόβλημα με τη στοίβα κλήσεων)

Λύση

Αυτό σημαίνει ότι κάπου στον κώδικά σας, καλείτε μια συνάρτηση η οποία με τη σειρά της καλεί μια άλλη συνάρτηση και ούτω καθεξής, μέχρι να φτάσετε στο όριο της στοίβας κλήσεων.

Αυτό οφείλεται σχεδόν πάντα σε μια αναδρομική συνάρτηση με μια βασική περίπτωση που δεν ικανοποιείται.

Προβολή της στοίβας

Σκεφτείτε αυτόν τον κώδικα...

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

Εδώ είναι η στοίβα μετά από μια χούφτα κλήσεων...

Όπως μπορείτε να δείτε, η στοίβα κλήσεων μεγαλώνει μέχρι να φτάσει σε ένα όριο: το σκληρά κωδικοποιημένο μέγεθος στοίβας του προγράμματος περιήγησης ή την εξάντληση της μνήμης.

Για να το διορθώσετε, βεβαιωθείτε ότι η αναδρομική σας συνάρτηση έχει μια βασική περίπτωση η οποία είναι σε θέση να ικανοποιηθεί...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
Σχόλια (16)

Μερικές φορές μπορεί να συμβεί αυτό αν κατά λάθος εισάγετε/ενσωματώσετε το ίδιο αρχείο JavaScript δύο φορές, αξίζει να το ελέγξετε στην καρτέλα πόρων του επιθεωρητή.

Σχόλια (6)

Υπάρχει κάπου στον κώδικά σας ένας αναδρομικός βρόχος (δηλαδή μια συνάρτηση που τελικά καλεί τον εαυτό της ξανά και ξανά μέχρι να γεμίσει η στοίβα).

Άλλοι browsers είτε έχουν μεγαλύτερες στοίβες (οπότε αντί για αυτό λαμβάνετε ένα timeout) είτε καταπίνουν το σφάλμα για κάποιο λόγο (ίσως ένα κακώς τοποθετημένο try-catch).

Χρησιμοποιήστε το πρόγραμμα εντοπισμού σφαλμάτων για να ελέγξετε τη στοίβα κλήσεων όταν συμβαίνει το σφάλμα.

Σχόλια (3)