私は最近、コールバックが自分自身をコールするコードを書く必要があり、NodeJSとテールコールサポートについて疑問を抱いていたので、私はこの答えを見つけましたhttps://stackoverflow.com/a/30369729それはサポートされていると言っています。NodeJSのテール再帰
"use strict";
function fac(n){
if(n==1){
console.trace();
return 1;
}
return n*fac(n-1);
}
fac(5);
のLinux x64の上でノード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)
明確にコールスタックが取得示し
は、だから私はこの単純なコードでそれを試してみました最新のNodeJSを使用していますが、呼び出しと末尾再帰でいっぱいです。
NodeJS/JavaScriptはテール再帰をまったくサポートしていますか? または、実際にジェネレータとyieldで行く必要がありますが、ここでの問題は、コールバックが非常に非同期になり、返り値で動作しないためです。コールスタックが無駄にならないようにする必要があります呼び出しは関数がそれ自体を参照する間に呼び出されます。
あなたは可能性があり再帰の代わりに 'while'ループを使って書き直してください。 – jfriend00
私が問題にしているように、コールバックは大量の非同期IO依存であるため、戻り値は気にしません。したがって、whileを使用することはできません。 – jakubinf
実際の例を表示することをお勧めします。非同期コールバックが呼び出される前に、元の関数が既に返されているため、非同期コールバックから実際にスタックビルドアップにつながることはありません。あなたが本当の問題を示していれば、あなたの本当の問題をより良く助けることができます。 – jfriend00