То, что вы называете отказоустойчивым, является отсутствующей функцией во всех реализациях, кроме Safari, в которой реализовано требование ES2016 JavaScript оптимизация хвостового вызова .В сафари вы не заметите никакой разницы между ними:
while (true) {
// code
}
(function loop () {
// code
loop()
})();
Нет переполнения стека и, как и ожидалось, браузер зависает навсегда.Причина этого в том, что, если вы не используете рабочих, JS является однопоточным, и никакой другой код JS в очереди хода не выполняется.например.
setTimeout(function(){ alert("This will never happen!"); }, 0);
(function loop () {
loop()
})();
Вы не должны писать во время циклов, которые не заканчиваются.Если вы допустили ошибку, я предлагаю вам сделать точку останова, чтобы проверить, почему она не завершается.В качестве альтернативы вы могли бы, если считаете, что что-то не так, сделать:
// TODO: remove debug limit
let limit = 100000; // limit
while (true)) {
if(!limit--) {
console.log('limit exceeded');
break; // set breakpoint here in debugger
}
}
Обратной стороной является то, что вам нужно удалить это, когда проблема будет решена.Моя IDE жалуется на этот TODO, поэтому он никогда не будет в git.Вы можете сделать то же самое с хвостовыми вызовами:
// TODO: remove debug limit
let limit = 100000; // limit
(function loop () {
// code
if(!limit--) {
console.log('limit exceeded');
return; // set breakpoint here in debugger
}
if (true) loop(); // might have another expression than true
})();