Sök…


Syntax

  • endast returnera samtal () antingen implicit, t.ex. i pilfunktion eller uttryckligen, kan vara ett svarssamtal
  • funktion foo () {returfält (); } // call to bar är ett svanssamtal
  • funktion foo () {bar (); } // bar är inte ett svanssamtal. Funktionen returnerar odefinierad när ingen återgivning ges
  • const foo = () => bar (); // bar () är ett svanssamtal
  • const foo = () => (poo (), bar ()); // poo är inte ett svanssamtal, bar är ett svanssamtal
  • const foo = () => poo () && bar (); // poo är inte ett svanssamtal, bar är ett svanssamtal
  • const foo = () => bar () + 1; // bar är inte ett svanssamtal eftersom det kräver sammanhang att returnera + 1

Anmärkningar

TCO är också känd som PTC (Rätt svanssamtal) som det hänvisas till i ES2015-specifikationerna.

Vad är Tail Call Optimization (Tail Call Optimization)

TCO finns endast i strikt läge

Som alltid kolla implementering av webbläsare och Javascript för support för alla språkfunktioner, och som med alla javascriptfunktioner eller syntax, kan det ändras i framtiden.

Det tillhandahåller ett sätt att optimera rekursiva och djupt kapslade funktionssamtal genom att eliminera behovet av att skjuta funktionstillstånd på den globala ramstacken och undvika att behöva stiga ned genom varje samtalsfunktion genom att återgå direkt till den inledande samtalsfunktionen.

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

Utan TCO skapar samtalet till a() en ny ram för den funktionen. När den funktionen ringer b() skjuts a() : s ram in på ramstacken och en ny ram skapas för funktion b()

När b() återgår till a() a() ram från ramstacken. Den återgår omedelbart till den globala ramen och använder således inga av de stater som är sparade på stacken.

TCO inser att samtalet från a() till b() är i funktionen a() och det finns därför inget behov av att skjuta a() tillstånd på ramstacken. När b(0) återgår snarare än att återgå till a() återgår den direkt till den globala ramen. Ytterligare optimering genom att eliminera mellanstegen.

TCO tillåter rekursiva funktioner att få obestämd rekursion eftersom ramstacken inte kommer att växa med varje rekursivt samtal. Utan TCO hade rekursiv funktion ett begränsat rekursivt djup.

Observera att TCO är en JavaScript-implementeringsfunktion, den kan inte implementeras via en transpilerare om webbläsaren inte stöder den. Det finns ingen ytterligare syntax i specifikationerna som krävs för att implementera TCO och det finns därför oro för att TCO kan bryta webben. Utlämningen till världen är försiktig och kan kräva att webbläsare / motorspecifika flaggor ställs in för en uppfattbar framtid.

Rekursiva öglor

Optimering av svanssamtal gör det möjligt att säkert implementera rekursiva slingor utan att oroa sig för samtalstapelöverflöde eller en växande rambunks överhead.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow