Vâng, đó là một cuộc gọi đuôi:
function(child) {
child.add(n);
//^tail
}
Tuy nhiên, không có gì ở đây là đệ quy đuôi, bởi vì nó không phải là một cuộc gọi đệ quy trực tiếp.
Ngoài ra this.children.forEach(…)
là cuộc gọi đuôi trong phương thức add
.
Tuy nhiên, yêu cầu gọi lại trong phương thức gốc forEach
có thể không được tối ưu hóa cho cuộc gọi đuôi (và tất cả trừ khi cuộc gọi cuối cùng không thể là anyway). Bạn có thể ép buộc bằng cách viết lại hàm của mình thành
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
};
Lưu ý rằng không có cuộc gọi đuôi nào được tối ưu hóa nếu bạn cũng không return
kết quả của chúng.
Tôi sẽ nói như vậy. Mặc dù nó nằm trong vòng lặp, nó vẫn là hành động cuối cùng được thực hiện. – Brennan
Tôi không chắc ... Tôi đang nghĩ về một vòng lặp 'for (i = 0; i
pixelmike
Có lẽ một 'đuôi gọi' trong JS sẽ làm cho việc sử dụng' return someFn() 'cũng cho phép hàm initator thu gom rác. –