В этом коде нет рекурсии, startAjax
выходит практически сразу после его вызова.Вы могли бы обойтись без переопределения функций при каждом вызове, хотя бы минимизировать использование памяти, но старые функции в конечном итоге все равно были бы gc, поскольку ссылаться на них невозможно.Ответ @ Догберта показывает, как избежать переопределения функций, но в этом нет ничего критического, поскольку в любом случае не образуются постоянные замыкания.
Формирование замыкания определяется как: когда вызывается внешняя функция, которая определяет внутреннюю функцию (и),и что (эти) внутренние функции доступны для выхода из внешней функции.
Теперь, если вы выполняете ajax в синхронном режиме, startAjax
никогда не завершится, и этопродолжал бы вызывать больше startAjax
косвенно, и вы бы в конечном итоге достигли максимального размера стека вызовов.Не говоря уже о том, что ваш пользовательский интерфейс будет заблокирован в 100% случаев.
Например, запустите его в Google Chrome, и вы получите:
RangeError: Maximum call stack size exceeded
function success(){
startAjax();
}
function error(){
startAjax();
}
function startAjax(){
synchronousAjax( success, error );
}
function synchronousAjax( success, error){
Math.random() < 0.5 ? success() : error();
}
startAjax();