Límite de tamaño de pila de Javascript del navegador

Resuelto guilhebl asked hace 12 años • 2 respuestas

Tengo algunos problemas de desbordamiento de la pila de Javascript del lado del cliente específicamente en el navegador IE, esto sucede dentro de una biblioteca de terceros que realiza algunas llamadas a funciones y, por alguna razón, ocasionalmente se frenan en IE solo debido a su límite de pila bajo.

Luego codifiqué un pequeño HTML de prueba para probar el límite de tamaño de pila para algunos navegadores y descubrí que IE8 en realidad tiene un límite de pila pequeño en comparación con FF 7 o Chrome 14 ejecutándose en una computadora portátil con sistema operativo Windows 7 y 8 Gb 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 genera un desbordamiento de pila cuando los valores rondan los 3200, Firefox y Chrome pueden manejar una recursividad muy profunda en comparación con IE.

Me gustaría saber si hay una manera de vincular la excepción de desbordamiento de pila con la función de Javascript que la generó durante el tiempo de ejecución en IE o cualquier otro navegador y si podría dar el seguimiento de pila con la cadena de funciones en la pila en el momento en que Se generó un error.

guilhebl avatar Oct 20 '11 02:10 guilhebl
Aceptado

Usando una prueba simple:

var i = 0;
function inc() {
  i++;
  inc();
}
    
try {
  inc();
}
catch(e) {
  // The StackOverflow sandbox adds one frame that is not being counted by this code
  // Incrementing once manually
  i++;
  console.log('Maximum stack size is', i, 'in your current browser');
}
Expandir fragmento

explorador de Internet

  • 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
  • 89: 10746
  • 91: 26441

Google Chrome

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

Safari

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

Safari iOS

  • 15: 7909

Ópera

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

Borde

  • 87: 13970
  • 93: 13903

yandex

  • 21: 13909

Con respecto a su pregunta, utilice las herramientas de desarrollo de su navegador para ver la pila. En IE 8+, presione F12, vaya a la pestaña Script y haga clic en Iniciar depuración. Se romperá cuando se produzca una excepción y podrá ver la pila de llamadas. También puedes utilizar las herramientas para desarrolladores de Chrome, Ctrl+ Shift+ J.

josh3736 avatar Oct 19 '2011 22:10 josh3736

Esto es específico del navegador, no solo el tamaño de la pila, sino también las optimizaciones, cosas como la optimización de la recursión de cola y demás. Supongo que lo único confiable aquí es codificar de una manera que no ponga toneladas de cosas en la pila, o probar manualmente (leer profundamente la documentación de) cada navegador. Después de todo, cuando vea el error "demasiada recursividad" o similar, ya sabrá que algo realmente anda mal con su código.

Nikoloff avatar Oct 19 '2011 19:10 Nikoloff