Le délai d'expiration défini ne provoquerait pas de dépassement de capacité de la pile, car il est asynchrone. Il va juste mettre le rappel à la file d'attente d'événements et ne pas bloquer l'exécution.
Dans le premier cas:
setTimeout met juste le rappel à la file d'attente d'événements et la fonction parent quitte après sans affairant la pile.
Même si le délai d'attente est de 0 ms, il sera appelé dans la prochaine boucle d'événement, donc pas bloquer le code dans l'exécution
var nextListItem = function() {
var item = list.pop();
if (item) {
setTimeout(nextListItem, 0);
}
};
Dans le second cas:
Parent appeler la fonction de l'enfant en mettant nouvelle entrée dans la pile, même si les parents ne sont pas effacés de la pile.
Finalement, plus d'appels récursifs pourraient faire sauter la pile.
var nextListItem = function() {
var item = list.pop();
if (item) {
nextListItem();
}
};
Si vous venez d'appeler nextListItem à partir de nextListItem, la pile augmentera à chaque appel jusqu'à ce que vous atteigniez le critère de sortie (liste vide). Lorsque vous utilisez setTimeout, la fonction externe se terminera et sera supprimée de la pile, seul l'appel de fonction interne sera sur la pile alors – devnull69