Suche…


Syntax

  • nur return call () entweder implizit, wie in der arrow-Funktion oder explizit, kann eine Schlussanweisung sein
  • function foo () {return bar (); } // Der Aufruf zur Sperre ist ein Rückruf
  • Funktion foo () {bar (); } // bar ist kein Rückruf. Die Funktion gibt undefined zurück, wenn keine Rückgabe erfolgt
  • const foo = () => bar (); // bar () ist ein Rückruf
  • const foo = () => (poo (), bar ()); // poo ist kein Schlussruf, Bar ist ein Schlussruf
  • const foo = () => poo () && bar (); // poo ist kein Schlussruf, Bar ist ein Schlussruf
  • const foo = () => bar () + 1; // bar ist kein Abruf, da der Kontext + 1 zurückgeben muss

Bemerkungen

TCO ist auch als PTC (Proper Tail Call) bekannt.

Was ist die Rückrufoptimierung (TCO)?

TCO ist nur im strikten Modus verfügbar

Überprüfen Sie die Browser- und Javascript-Implementierungen immer auf Unterstützung für alle Sprachfunktionen. Wie auch bei jeder JavaScript-Funktion oder -Syntax können sich Änderungen in der Zukunft ergeben.

Es bietet eine Möglichkeit, rekursive und tief verschachtelte Funktionsaufrufe zu optimieren, indem der Funktionsstatus nicht mehr auf den globalen Frame-Stack gepusht wird. Außerdem muss nicht jede aufrufende Funktion zurückgesetzt werden, indem direkt zur ursprünglichen aufrufenden Funktion zurückgekehrt wird.

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

Ohne TCO erstellt der Aufruf von a() einen neuen Rahmen für diese Funktion. Wenn diese Funktion b() aufruft, wird der Frame von a() auf den Frame-Stack verschoben und ein neuer Frame für Funktion b()

Wenn b() Rückkehr zu a() a() ‚s - Rahmen wird von dem Rahmen Stapel geholt. Es kehrt sofort zum globalen Rahmen zurück und verwendet daher keinen der auf dem Stapel gespeicherten Zustände.

TCO erkennt, dass der Aufruf von a() an b() am Ende der Funktion a() und es ist nicht erforderlich, den Status von a() auf den Frame Stack zu schieben. Wenn b(0) zurückkehrt, anstatt zu a() , kehrt es direkt zum globalen Frame zurück. Weitere Optimierung durch Wegfall der Zwischenschritte.

TCO ermöglicht für rekursive Funktionen eine unbegrenzte Rekursion, da der Frame-Stack nicht mit jedem rekursiven Aufruf wächst. Ohne TCO hatte die rekursive Funktion eine begrenzte rekursive Tiefe.

Hinweis TCO ist eine JavaScript-Engine-Implementierungsfunktion. Sie kann nicht über einen Transpiler implementiert werden, wenn der Browser dies nicht unterstützt. Es gibt keine zusätzliche Syntax in der Spezifikation, die zur Implementierung der TCO erforderlich ist. Daher besteht die Gefahr, dass die TCO das Web beschädigt. Die Veröffentlichung in der Welt ist vorsichtig und erfordert möglicherweise Browser- / Engine-spezifische Flags für die wahrnehmbare Zukunft.

Rekursive Schleifen

Die Rückrufoptimierung ermöglicht die sichere Implementierung rekursiver Schleifen, ohne dass der Call-Stack-Überlauf oder der Overhead eines wachsenden Frame-Stacks bedroht ist.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow