Итак, недавно я столкнулся со случаем, когда мне нужно было написать код, в котором обратный вызов вызывает сам себя и т. д., и я задавался вопросом о поддержке NodeJS и хвостового вызова, поэтому я нашел этот ответ https://stackoverflow.com/a/30369729 говорит, что да, это поддерживается.
Итак, я попробовал это с помощью этого простого кода:
"use strict";
function fac(n){
if(n==1){
console.trace();
return 1;
}
return n*fac(n-1);
}
fac(5);
Используя Node 6.9.2 в Linux x64 и запустив его как 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 хвостовую рекурсию? Или мне действительно нужно использовать генераторы и выходы, но проблема здесь в том, что мои обратные вызовы будут сильно асинхронными, и я все равно не буду работать с возвращаемым значением, мне просто нужно убедиться, что стек вызовов не будет бесполезно заполнен вызовы, в то время как функция ссылается на себя в ответ.
while
вместо рекурсии. - person jfriend00   schedule 16.01.2017