JavaScript Qu'est-ce que l'optimisation d'appel de queue (TCO)?


Exemple

Le TCO est uniquement disponible en mode strict

Comme toujours vérifier les implémentations de navigateur et de Javascript pour la prise en charge de toutes les fonctionnalités de langage, et comme avec toute fonctionnalité ou syntaxe de javascript, cela peut changer dans le futur.

Il offre un moyen d'optimiser les appels de fonctions récursifs et profondément imbriqués en éliminant le besoin de pousser l'état des fonctions sur la pile d'images globale et en évitant de passer par chaque fonction d'appel en retournant directement à la fonction d'appel initiale.

function a(){
   return b(); // 2
} 
function b(){
   return 1;  // 3
}
a(); // 1

Sans TCO, l'appel à a() crée une nouvelle image pour cette fonction. Lorsque cette fonction appelle b() la trame de a a() est poussée sur la pile d'images et une nouvelle image est créée pour la fonction b()

Lorsque b() retourne à a() a() est sorti de la pile des images. Il retourne immédiatement au cadre global et n'utilise donc aucun des états sauvegardés sur la pile.

TCO reconnaît que l'appel de a() à b() est à la fin de la fonction a() et qu'il n'est donc pas nécessaire de pousser l'état d' a() sur la pile de trames. Lorsque b(0) renvoie plutôt que de retourner à a() il retourne directement au cadre global. Optimisation supplémentaire en éliminant les étapes intermédiaires.

TCO permet aux fonctions récursives d'avoir une récursivité indéfinie, car la pile de trames ne grossira pas à chaque appel récursif. Sans TCO, la fonction récursive avait une profondeur récursive limitée.

Remarque TCO est une fonctionnalité d'implémentation du moteur JavaScript, il ne peut pas être implémenté via un transpiler si le navigateur ne le prend pas en charge. Il n'y a pas de syntaxe supplémentaire dans la spécification requise pour implémenter le TCO et il est donc à craindre que le TCO puisse casser le Web. Sa sortie dans le monde est prudente et peut nécessiter des indicateurs spécifiques au navigateur / moteur pour le futur perceptible.