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).
Le message est le suivant
La taille maximale de la pile d'appels est dépassée.
Que signifie exactement cette erreur et le traitement s'arrête-t-il complètement ?
Y a-t-il également un correctif pour le navigateur "Safari" (en fait, sur l'"iPad Safari", il est écrit
JS:execution exceeded timeout
ce qui, je suppose, est le même problème de pile d'appels)
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 satisfait.
Considérez ce code...
(function a() {
a();
})();
Voici la pile après une poignée d'appels...
![Inspecteur Web][2]
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 résoudre ce problème, assurez-vous que votre fonction récursive a un cas de base qui peut être satisfait...
(function a(x) {
// The following condition
// is the base case.
if ( ! x) {
return;
}
a(--x);
})(10);
[1] : https://stackoverflow.com/questions/310974/what-is-tail-call-optimization [2] : http://i.stack.imgur.com/aSwnu.png
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.