746 votes

Erreur de taille maximale de la pile d'appels dépassée

J'utilise un fichier de bibliothèque JavaScript de Direct Web Remoting (DWR) et je reçois une erreur uniquement dans Safari (bureau et iPad).

Il est dit

La taille maximale de la pile d'appels est dépassée.

Que signifie exactement cette erreur et est-ce qu'elle arrête complètement le traitement ?

De même, tout correctif pour Safari (en fait, sur le iPad Safari il est dit

JS:exécution dépassée timeout

ce qui, je suppose, est le même problème de pile d'appels)

3 votes

J'ai obtenu cette erreur en essayant d'envoyer des variables (sans les déclarer), par le biais de data en ajax. Corriger l'erreur en déclarant les variables.

0 votes

Boucle infinie ...

0 votes

Pour moi, le nom de ma fonction JavaScript était onclick() et j'ai obtenu cette erreur :-) Bien que ces noms soient réservés

828voto

alex Points 186293

Cela signifie que, quelque part dans votre code, vous appelez une fonction qui, à son tour, appelle une autre fonction et ainsi de suite, jusqu'à ce que vous atteigniez la limite de la pile d'appels.

Cela est presque toujours dû à une fonction récursive dont le cas de base n'est pas respecté.

Visualisation de la pile

Considérez ce code...

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

Voici la pile après une poignée d'appels...

Web Inspector

Comme vous pouvez le constater, la pile d'appels croît jusqu'à ce qu'elle atteigne une limite : la taille de la pile codée en dur par le navigateur ou l'épuisement de la mémoire.

Pour le corriger, assurez-vous que votre fonction récursive a un cas de base qui peut être rencontré...

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

7 votes

Encore une fois, comme il s'agit d'un énorme fichier de bibliothèque et qu'il n'a pas été créé par moi, je ne suis pas tout à fait conscient de l'endroit où les choses peuvent mal tourner

1 votes

Ainsi, en utilisant l'inspecteur dans Safari, je pourrai voir la "pile d'appels"... De plus, dois-je afficher la pile pour une fonction particulière ou pour l'ensemble du JS... Comment dois-je vérifier cette pile d'appels ?

0 votes

@hmthr J'ai utilisé Google Chrome pour ce qui précède, mais je me souviens que l'inspecteur de Safari était assez similaire.

104voto

lucygenik Points 262

Ce problème peut parfois se produire si vous importez ou intégrez accidentellement le même fichier JavaScript deux fois, ce qui mérite d'être vérifié dans l'onglet Ressources de l'inspecteur.

9 votes

Ce problème survient généralement lorsque vous importez/insérez accidentellement le même fichier JS deux fois. Je n'ai pas envie de spéculer sur le processus exact qui provoque la boucle récursive, mais je suppose qu'il s'agit de quelque chose comme faire passer deux voitures identiques à 100 mph par la même barrière de péage.

4 votes

Je ne pense pas que ce soit le cas. Si deux fonctions ou variables de même type sont incorporées, ces dernières remplacent les définitions précédentes.

0 votes

Oui... Je ne sais pas vraiment pourquoi ça arrive ou quel est le processus, j'aurais pensé que ça aurait aussi été prioritaire.

37voto

Aaron Digulla Points 143830

Il y a une boucle récursive quelque part dans votre code (c'est-à-dire une fonction qui finit par s'appeler elle-même encore et encore jusqu'à ce que la pile soit pleine).

Les autres navigateurs ont soit des piles plus grandes (ce qui fait que vous obtenez un délai d'attente à la place), soit ils avalent l'erreur pour une raison quelconque (peut-être un try-catch mal placé).

Utilisez le débogueur pour vérifier la pile d'appels lorsque l'erreur se produit.

0 votes

Merci beaucoup pour votre réponse. Sur IE/FF, le code semble fonctionner correctement Seulement dans le Safari de bureau et le Safari iPad, j'obtiens l'erreur. En fait le fichier JS n'est pas ma propre création, mais est un fichier de bibliothèque (de DWR engine.js) . directwebremoting.org De plus, lorsque vous dites "débogueur pour vérifier la pile d'appels", comment puis-je le faire en utilisant l'inspecteur de Safari ?

0 votes

Je n'ai pas d'expérience avec Safari Inspector. Essayez d'ouvrir le débogueur JavaScript et de charger votre page. Le débogueur devrait s'arrêter lorsqu'une erreur non corrigée est lancée. Si cela ne fonctionne pas, demandez sur superuser ou webmasters (voir en bas de la page)

0 votes

J'ai eu 2 fonctions nommées de la même façon ! DOH !

5voto

chim Points 1799

Vérifiez les détails de l'erreur dans la console de la barre d'outils de Chrome dev, ce qui vous donnera les fonctions dans la pile d'appels, et vous guidera vers la récursion qui cause l'erreur.

4voto

Dr. Dama Points 106

Si vous avez besoin d'un processus infini/récursion pour une raison quelconque, vous pouvez utiliser un webworker dans un thread séparé. http://www.html5rocks.com/en/tutorials/workers/basics/

si vous voulez manipuler des éléments de dom et les redessiner, utilisez l'animation http://creativejs.com/resources/requestanimationframe/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X