Sì, si tratta di una chiamata coda:
function(child) {
child.add(n);
//^tail
}
Eppure qui non c'è una coda ricorsiva, perché non è una chiamata ricorsiva diretta.
Anche this.children.forEach(…)
è una chiamata di coda all'interno del metodo add
.
Tuttavia, l'invocazione del callback all'interno del metodo nativo forEach
non è probabilmente ottimizzata in coda (e tutto tranne l'ultimo non può essere comunque). È possibile forzarlo riscrivendo la funzione di
Blah.prototype.add = function(n) {
"use strict";
this.total += n;
let l = this.children.length;
if (!l--)
return;
for (let i=0; i<l; i++)
this.children[i].add(n);
this.children[i].add(n); // tail-recursion
};
noti che nessuna di queste chiamate di coda sarà ottimizzato Se non anche return
i loro risultati.
Direi così. Anche se si trova all'interno di un ciclo, è ancora l'ultima azione eseguita. – Brennan
Non ero sicuro ... stavo pensando a un ciclo tradizionale 'for (i = 0; i
pixelmike
Presumibilmente un 'tail call 'in JS renderebbe l'uso di' return someFn() 'permettendo anche alla funzione initator di essere garbage collection. –