当本身不支持时,像 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;
}
}
它将其重写为一个 while 循环。
即使使用 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;
}
}
它将其重写为一个 while 循环。