Ograniczenie rozmiaru stosu Javascript w przeglądarce

Dostaję problemy z przepełnieniem stosu Javascript po stronie klienta, szczególnie w przeglądarce IE, dzieje się to wewnątrz biblioteki innej firmy, która wykonuje niektóre wywołania funkcji i z jakiegoś powodu czasami hamują w IE tylko ze względu na niski limit stosu.

Następnie zakodowałem mały testowy kod HTML, aby przetestować limit rozmiaru stosu dla niektórych przeglądarek i okazało się, że IE8 ma faktycznie mały limit stosu w porównaniu do FF 7 lub Chrome 14 działającego na laptopie z systemem operacyjnym Windows 7, 8Gb 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 podnosi przepełnienie stosu, gdy wartości wynoszą około 3200, Firefox i Chrome mogą obsłużyć bardzo głęboką rekurencję w porównaniu do IE.

Chciałbym wiedzieć, czy istnieje sposób, aby powiązać wyjątek stack-overflow z funkcją Javascript, która podniosła go podczas wykonywania w IE lub innej przeglądarce i czy może dać stacktrace z łańcuchem funkcji w stosie w momencie wystąpienia błędu.

Author: L84, 2011-10-19

2 answers

Za pomocą prostego testu :

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

W odniesieniu do twojego pytania, użyj narzędzi programistycznych swojej przeglądarki, aby zobaczyć stos. W IE 8+ Naciśnij F12 , przejdź do karty skrypt i kliknij Rozpocznij debugowanie. Pęknie, gdy wyjątek jest wyrzucany i możesz zobaczyć stos wywołań. Możesz również użyć narzędzi programistycznych Chrome, Ctrl+Shift+J .

 99
Author: josh3736,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 13:59:21

Jest to specyficzne dla przeglądarki, nie tylko rozmiar stosu, ale także optymalizacje, takie jak optymalizacja rekurencji ogonowej i takie tam. Myślę, że jedyną niezawodną rzeczą tutaj jest kodowanie w sposób, który nie wkłada ton rzeczy do stosu, lub ręczne testowanie (czytanie głęboko w dokumentacji) każdej przeglądarki. Po tym wszystkim, kiedy widzisz błąd "za dużo rekurencji" lub podobny, już wiesz, że coś naprawdę jest nie tak z Twoim kodem.

 5
Author: Nikoloff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 19:35:41