我最近学习了Haskell中的尾调用优化。我从以下帖子中了解到这不是JavaScript的一个特性:
难道JavaScript的设计内在特点使得尾调用优化特别困难吗?为什么像Haskell这样的语言将其作为主要特性,而只有现在某些JavaScript引擎正在讨论其作为特性?
function tcoMe(x){
if(x === 0) return x;
return tcoMe(x-1)
}
被转换为:
function tcoMe(_x) {
var _again = true;
_function: while (_again) {
var x = _x;
_again = false;
if (x === 0) return x;
_x = x - 1;
_again = true;
continue _function;
}
}
那就是——使用while循环。
至于为什么只有最近才支持这个功能,因为社区之前没有太大的需求。由于JavaScript是一种带有循环语句的命令式语言,所以在绝大多数情况下,您可以自己编写此优化(这与ML不同,在ML中,这是必需的,正如Bergi所指出的那样)。