Buscar..
Sintaxis
- solo devolver call () implícitamente como en la función de flecha o explícitamente, puede ser una declaración de llamada de cola
- función foo () {barra de retorno (); } // la llamada a la barra es una llamada de cola
- función foo () {bar (); } // la barra no es una llamada de cola. La función devuelve undefined cuando no se da retorno
- const foo = () => bar (); // bar () es una llamada de cola
- const foo = () => (poo (), bar ()); // poo no es una llamada de cola, bar es una llamada de cola
- const foo = () => poo () && bar (); // poo no es una llamada de cola, bar es una llamada de cola
- const foo = () => bar () + 1; // la barra no es una llamada de cola, ya que requiere un contexto para devolver + 1
Observaciones
TCO también se conoce como PTC (Proper Tail Call) como se menciona en las especificaciones ES2015.
¿Qué es Tail Call Optimization (TCO)?
TCO solo está disponible en modo estricto
Como siempre, compruebe las implementaciones de navegador y Javascript para el soporte de las funciones de cualquier idioma, y como con cualquier función o sintaxis de javascript, puede cambiar en el futuro.
Proporciona una forma de optimizar las llamadas de función recursivas y profundamente anidadas eliminando la necesidad de empujar el estado de la función en la pila de cuadros global, y evitando tener que pasar por cada función de llamada al regresar directamente a la función de llamada inicial.
function a(){
return b(); // 2
}
function b(){
return 1; // 3
}
a(); // 1
Sin TCO, la llamada a a()
crea un nuevo marco para esa función. Cuando esa función llama a b()
el marco de a a()
se empuja hacia la pila de marcos y se crea un nuevo marco para la función b()
Cuando b()
vuelve al marco de a a()
a()
, se extrae de la pila de cuadros. Inmediatamente regresa al marco global y, por lo tanto, no utiliza ninguno de los estados guardados en la pila.
El TCO reconoce que la llamada de a()
a b()
está en la cola de la función a()
y, por lo tanto, no es necesario empujar el estado de a()
en la pila de cuadros. Cuando b(0)
devuelve en lugar de regresar a a()
, regresa directamente al marco global. Optimizando aún más eliminando los pasos intermedios.
El TCO permite que las funciones recursivas tengan una recursión indefinida ya que la pila de cuadros no crecerá con cada llamada recursiva. Sin TCO la función recursiva tuvo una profundidad recursiva limitada.
Nota TCO es una función de implementación del motor javascript, no se puede implementar a través de un transpiler si el navegador no lo admite. No hay una sintaxis adicional en la especificación requerida para implementar el TCO y, por lo tanto, existe la preocupación de que el TCO pueda romper la web. Su lanzamiento al mundo es cauteloso y puede requerir que se establezcan indicadores específicos del navegador / motor para el futuro perceptible.
Bucles recursivos
Tail Call Optimization hace posible la implementación segura de bucles recursivos sin preocuparse por el desbordamiento de la pila de llamadas o la sobrecarga de una pila de cuadros en crecimiento.
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