javascript - 无法在 Node v6.4.0 中启用尾调用优化

标签 javascript node.js recursion 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))

还是失败了。我试过在函数体内和文件顶部添加 'use strict'; 。我试过使用 --harmony--harmony-tailcalls

相同的功能在 Racket 中如预期的那样工作:

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

编辑:

正如@MatthieuLemoine 所建议的。它在 v6.5.0+ 中与 "use strict";--harmony--harmony-tailcalls

一起工作

最佳答案

使用 Node 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));

使用 --harmony-tailcalls 标志运行:

node --harmony-tailcalls tco.js

关于javascript - 无法在 Node v6.4.0 中启用尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39617910/

相关文章:

javascript - 使用 JavaScript 捕获视频和音频

javascript - 尝试为我的 nodejs Controller 编写我的第一个 "global"函数

java - 递归回溯问题 - 数独求解示例

php - SQL 树结构父子

javascript - 如何在一个模板中识别多个表单?

javascript - 如果变量不存在,console.log 返回 html 元素

java - Single Sign on Java and NodeJs (Share single session object between Java and Nodejs)

javascript - 处理 Promise 拒绝案例 Mocha

c++ - 不通过起始颜色的 4 向填充功能

javascript - Three.js:重新定向旋转轴