无法在节点v6.4.0中启用尾调用优化

she*_*dog 6 javascript recursion node.js ecmascript-6

我不想在node/es2015中使用尾调用优化,但我一直在努力RangeError: Maximum call stack size exceeded.所以我尝试了一个非常简单的测试功能:

  function countTo(n, acc) {
    if(n === 0) {
      return acc;
    }
    return countTo(n - 1, acc + n);
  }

  console.log(countTo(100000 , 0))
Run Code Online (Sandbox Code Playgroud)

它仍然失败.我已经尝试'use strict';在函数体内添加并在文件的顶部.我尝试过使用--harmony--harmony-tailcalls

相同的功能在球拍中按预期工作:

#lang racket
(define count-to
  (lambda (n acc)
    (cond
      ((= n 0) acc)
      (else (count-to (- n 1) (+ acc n))))))
(count-to 100000000 0)
; ~> 5000000050000000
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@MatthieuLemoine建议的那样.它适用于v6.5.0 +和"use strict";,或者--harmony或者--harmony-tailcalls

Mat*_*ine 2

使用节点 v6.5.0,可以进行以下工作:

function countTo(n, acc) {
  'use strict';
  if(n === 0) {
    return acc;
  }
  return countTo(n - 1, acc + n);
}
console.log(countTo(100000 , 0));
Run Code Online (Sandbox Code Playgroud)

带标志运行--harmony-tailcalls

node --harmony-tailcalls tco.js
Run Code Online (Sandbox Code Playgroud)