Zoeken…


Syntaxis

  • alleen return call (), impliciet zoals in de pijlfunctie of expliciet, kan een tail call-statment zijn
  • functie foo () {retourbalk (); } // de aanroep naar balk is een staartoproep
  • functie foo () {bar (); } // balk is geen tail call. De functie retourneert ongedefinieerd wanneer er geen retour wordt gegeven
  • const foo = () => bar (); // bar () is een staartaanroep
  • const foo = () => (poo (), bar ()); // poep is geen tail call, bar is een tail call
  • const foo = () => poo () && bar (); // poep is geen tail call, bar is een tail call
  • const foo = () => bar () + 1; // bar is geen staartaanroep omdat context vereist is om + 1 terug te keren

Opmerkingen

TCO staat ook bekend als PTC (Proper Tail Call), waarnaar wordt verwezen in de ES2015-specificaties.

Wat is Tail Call Optimization (TCO)

TCO is alleen beschikbaar in de strikte modus

Zoals altijd de browser- en Javascript-implementaties controleren op ondersteuning van taalfuncties, en zoals bij elke JavaScript-functie of syntax, kan dit in de toekomst veranderen.

Het biedt een manier om recursieve en diep geneste functieaanroepen te optimaliseren door de noodzaak om de functiestatus naar de globale framestapel te duwen te elimineren en te voorkomen dat u door elke aanroepfunctie moet aftreden door rechtstreeks terug te keren naar de oorspronkelijke aanroepfunctie.

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

Zonder TCO creëert de aanroep van a() een nieuw frame voor die functie. Wanneer die functie b() aanroept, wordt het frame van a() op de framestapel geplaatst en wordt een nieuw frame gemaakt voor functie b()

Wanneer b() terugkeert naar a() wordt het frame van a() uit de framestapel gehaald. Het keert onmiddellijk terug naar het globale frame en gebruikt dus geen van de staten die op de stapel zijn opgeslagen.

TCO herkent dat de aanroep van a() naar b() zich aan het einde van functie a() en dat het dus niet nodig is de status van a() op de framestapel te duwen. Wanneer b(0) terugkeert in plaats van terug te keren naar a() , keert het rechtstreeks terug naar het globale frame. Verdere optimalisatie door de tussenstappen te elimineren.

Met TCO kunnen recursieve functies onbepaalde recursie hebben, omdat de framestapel niet groeit met elke recursieve aanroep. Zonder TCO had recursieve functie een beperkte recursieve diepte.

Opmerking TCO is een functie voor het implementeren van een javascript-engine, het kan niet worden geïmplementeerd via een transpiler als de browser dit niet ondersteunt. Er is geen extra syntaxis in de specificatie die nodig is om TCO te implementeren en daarom bestaat er bezorgdheid dat TCO het web kan breken. De introductie ervan in de wereld is voorzichtig en vereist mogelijk vlaggen / browserspecifieke vlaggen voor de waarneembare toekomst.

Recursieve lussen

Tail Call Optimization maakt het mogelijk om recursieve lussen veilig te implementeren zonder zorgen voor overflow van de call-stack of de overhead van een groeiende frame-stack.

function indexOf(array, predicate, i = 0) {
    if (0 <= i && i < array.length) {
        if (predicate(array[i])) {  return i; }
        return indexOf(array, predicate, i + 1); // the tail call
    }
}
indexOf([1,2,3,4,5,6,7], x => x === 5); // returns index of 5 which is 4


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow