Ограничение размера стека Javascript браузера
Я получаю некоторые проблемы переполнения стека Javascript на стороне клиента, особенно в браузере IE, это происходит внутри сторонней библиотеки, которая делает некоторые вызовы функций, и по какой-то причине они иногда тормозят в IE только из-за его низкого предела стека.
затем я закодировал небольшой тест HTML, чтобы проверить ограничение размера стека для некоторых браузеров и обнаружил, что IE8 фактически имеет небольшой предел стека по сравнению с FF 7 или Chrome 14, работающим на ноутбуке с ОС Windows 7, 8Gb Оперативная память:
<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 или любом другом браузере, и может ли он дать stacktrace с цепочкой функций в стеке в момент возникновения ошибки.
2 ответов
С помощью простой тест:
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
сафари
- 4: 52426
- 5: 65534
- 9: 63444
Опера
- 10.10: 9999
- 10.62: 32631
- 11: 32631
- 12: 32631
что касается вашего вопроса, используйте инструменты разработчика Вашего браузера, чтобы увидеть стек. В IE 8+, нажмите F12 перейдите на вкладку "сценарий" и нажмите кнопку начать отладку. Он сломается при возникновении исключения, и вы можете увидеть стек вызовов. Вы также можете использовать инструменты разработчика в Chrome, Ctrl+ Shift+J.
это специфичный браузер, не только размер стека, но и оптимизация, такие вещи, как оптимизация хвостовой рекурсии и прочее. Я думаю, что единственная надежная вещь здесь-это код таким образом, чтобы не помещать тонны вещей в стек или вручную тестировать(читать глубоко в документацию) каждого браузера. В конце концов, когда вы видите ошибку "слишком много рекурсии" или подобное, вы уже знаете, что с вашим кодом что-то не так.