web-dev-qa-db-fra.com

Navigateur Javascript Limite de taille de pile

Je reçois des problèmes de débordement de pile Javascript côté client spécifiquement dans IE navigateur, cela se produit dans une bibliothèque tierce qui effectue des appels de fonction et pour une raison quelconque, ils freinent parfois IE uniquement en raison de sa faible limite de pile.

J'ai ensuite codé un petit test HTML pour tester la limite de taille de pile pour certains navigateurs et j'ai trouvé qu'IE8 avait en fait une petite limite de pile par rapport à FF 7 ou Chrome 14 fonctionnant sur un ordinateur portable avec Windows 7 OS, 8 Go de RAM:

<html>
<body>

<!-- begin Script: -->
<script type="text/javascript">

function doSomething(){

  var i = 3200;
  doSomethingElse(i);

}

function doSomethingElse(i){
  if (i == 0) return -1;
  doSomethingElse(i-1);
}

doSomething(); 

</script>
<!-- END OF PAGE -->

</body>
</html>

IE augmente le débordement de pile lorsque les valeurs sont autour de 3200, Firefox et Chrome peut gérer une récursion très profonde par rapport à IE.

Je voudrais savoir s'il existe un moyen de lier l'exception de débordement de pile avec la fonction Javascript qui l'a déclenchée lors de l'exécution dans IE ou tout autre navigateur et s'il pourrait donner la trace de pile avec la chaîne de fonction dans la pile au moment où l'erreur a été déclenchée.

61
guilhebl

Utiliser n test simple :

var i=0;
function inc() {
    i++;
    inc();
}
inc();

Internet Explorer

  • IE6: 1130
  • IE7: 2553
  • IE8: 1475
  • IE9: 20678
  • IE10: 20677

Mozilla Firefox

  • 3.6: 3000
  • 4.0: 9015
  • 5.0: 9015
  • 6.0: 9015
  • 7.0: 65533
  • 8b3: 63485
  • 17: 50762
  • 18: 52596
  • 19: 52458
  • 42: 281810

Google Chrome

  • 14: 26177
  • 15: 26168
  • 16: 26166
  • 25: 25090
  • 47: 20878
  • 51: 41753

Safari

  • 4: 52426
  • 5: 65534
  • 9: 63444

Opera

  • 10.10: 9999
  • 10.62: 32631
  • 11: 32631
  • 12: 32631

En ce qui concerne votre question, utilisez les outils de développement de votre navigateur pour voir la pile. Dans IE 8+, appuyez sur F12, accédez à l'onglet Script et cliquez sur Démarrer le débogage. Il se cassera lorsqu'une exception est levée, et vous pouvez voir la pile d'appels. Vous pouvez également utiliser les outils de développement de Chrome, Ctrl+Shift+J.

110
josh3736

Ceci est spécifique au navigateur, non seulement la taille de la pile, mais aussi les optimisations, des choses comme l'optimisation de la récursivité de queue et d'autres choses. Je suppose que la seule chose fiable ici est de coder d'une manière qui ne met pas des tonnes de choses dans la pile, ou de tester manuellement (en lisant en profondeur la documentation de) chaque navigateur. Après tout, lorsque vous voyez l'erreur "trop ​​de récursivité" ou similaire, vous savez déjà que quelque chose ne va vraiment pas avec votre code.

5
Nikoloff