当本身不支持时,像 Babel 这样的转译器如何实现尾部调用优化?

How does a transpiler like Babel implement tail call optimization when it is not supported inherently?

即使使用 trampoline/bind,无限递归也应该在每次迭代中达到 memory/time 更高,那么即使当前不支持,Babel 如何实现它?

Babel 尝试将递归重写为一个简单的循环,您可以在 the example 中看到他们在文档中给出的内容:

function factorial(n, acc = 1) {
    "use strict";
    if (n <= 1) return acc;
    return factorial(n - 1, n * acc);
}

被重写为

"use strict";

function factorial(_x2) {
    var _arguments = arguments;
    var _again = true;

    _function: while (_again) {
        var n = _x2;
        acc = undefined;

        "use strict";
        _again = false;
        var acc = _arguments[1] === undefined ? 1 : _arguments[1];
        if (n <= 1) return acc;
        _arguments = [_x2 = n - 1, n * acc];
        _again = true;
        continue _function;
    }
}

看看:https://babeljs.io/repl/#?experimental=false&evaluate=false&loose=false&spec=false&code=const%20a%20%3D%20(n)%3D%3E%20a(n%2B1)

它将其重写为一个 while 循环。