Ограничение размера стека в браузере Javascript - PullRequest
62 голосов
/ 19 октября 2011

У меня проблемы с переполнением стека Javascript на стороне клиента, особенно в браузере IE, это происходит внутри сторонней библиотеки, которая делает некоторые вызовы функций, и по некоторым причинам они иногда тормозят в IE только из-за низкого предела стека.

Затем я написал небольшой тестовый HTML, чтобы проверить ограничение размера стека для некоторых браузеров, и обнаружил, что IE8 имеет небольшой предел стека по сравнению с FF 7 или Chrome 14, работающими на ноутбуке с ОС Windows 7, 8 ГБ ОЗУ: 1003 *

<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 увеличивает переполнение стека, когда значения около 3200, Firefox и Chrome могут обрабатывать очень глубокую рекурсию по сравнению с IE.

Я хотел бы знать, есть ли способ связать исключение переполнения стека с функцией Javascript, которая вызвала его во время выполнения в IE или любом другом браузере, и может ли оно дать трассировку стека цепочкой функций в стеке по адресу момент возникновения ошибки.

Ответы [ 2 ]

113 голосов
/ 20 октября 2011

Использование простого теста :

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

Опера

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

В отношении вашеговопрос, используйте инструменты разработчика вашего браузера, чтобы увидеть стек.В IE 8+ нажмите F12 , перейдите на вкладку «Сценарий» и нажмите «Начать отладку».Он сломается, когда возникнет исключение, и вы сможете увидеть стек вызовов.Вы также можете использовать инструменты разработчика Chrome: Ctrl + Shift + J .

5 голосов
/ 19 октября 2011

Это зависит от браузера, не только размер стека, но также и оптимизации, такие вещи, как оптимизация хвостовой рекурсии и прочее.Полагаю, единственная надежная вещь здесь - это кодирование таким образом, чтобы не складывать тонны вещей в стек, или ручное тестирование (чтение в документации) каждого браузера.В конце концов, когда вы видите ошибку «слишком много рекурсии» или подобное, вы уже знаете, что с вашим кодом что-то действительно не так.

...