相关疑难解决方法(0)

为什么没有javascript引擎支持尾调优化?

我最近在Haskell中了解了尾部调用优化.我从以下帖子中了解到这不是javascript的一个功能:

是否有一些固有的javascript设计使得尾调用优化特别困难?为什么这是像haskell这样的语言的主要特征,但现在才被讨论作为某些javascript引擎的特性?

javascript recursion tail-recursion tail-call-optimization

4
推荐指数
1
解决办法
415
查看次数

NodeJS中的尾递归

所以我最近遇到的情况我需要编写回调调用自己的代码等等,并想知道NodeJS和尾调用支持,所以我发现这个答案/sf/answers/2125881061/说是的,它支持.

所以我尝试使用这个简单的代码:

"use strict";
function fac(n){
    if(n==1){
        console.trace();
        return 1;
    }
    return n*fac(n-1);
}

fac(5);
Run Code Online (Sandbox Code Playgroud)

在Linux x64上使用Node 6.9.2并运行它node tailcall.js --harmony --harmony_tailcalls --use-strict ,结果是:

Trace
    at fac (/home/tailcall.js:4:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at Object.<anonymous> (/home/tailcall.js:10:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
Run Code Online (Sandbox Code Playgroud)

这清楚地表明callstack充满了调用,虽然我使用最新的NodeJS,但不支持尾递归.

NodeJS/JavaScript是否支持尾递归?或者我真的必须使用生成器和产量,但问题是我的回调将是非常异步的,无论如何我都不会使用返回值,我只需要确保callstack不会无用地填充函数引用自身作为回报.

javascript recursion tail-call-optimization node.js

4
推荐指数
1
解决办法
1215
查看次数