在 PhantomJS 中,函数调用堆栈限制是多少?

In PhantomJS, what is the function call stack limit?

在突破 PhantomJS javascript 引擎的调用堆栈限制之前,函数可以递归调用多少次?换句话说,这里为 PhantomJS 打印的最后可能 n 是什么:

var n = 0;
function f() {
  console.log(++n);
  f();
}
f();

我在我的 PC 和我的 Raspberry Pi 1 运行 Raspbian.

的不同 PhantomJS 版本中使用了你的代码 运行
Platform | Version | Maximum callstack
--------------------------------------
Win 8.1  | 2.0.0   | 65277
Win 8.1  | 1.9.8   | 65534
Win 8.1  | 1.9.7   | 65534
Win 8.1  | 1.9.0   | 65534
Win 8.1  | 1.8.2   | 65534
RPi 1    | 2.0.1*  | 43547
RPi 1    | 1.9.7   | 65534
RPi 1    | 1.9.0   | 65534

* 开发版编译于 2015 年 3 月 13 日 Raspberry Pi 2

下面是一个更真实的代码示例,因为您很少在 PhantomJS 脚本或页面上使用同步和递归代码。

var n = 0;
function f() {
  console.log(++n);
  //f();
  setTimeout(f, 0);
}
f();

这个更容易被使用的异步版本没有明显的调用堆栈限制。在大约 300,000 次迭代(52 分钟)后,我停止了该过程(Win 8.1 上的 v1.9.8 和 v2.0.0)。版本 1.9.8 始终占用 27.2 MB 内存,而 v2.0.0 在 运行8 到 10 MB 内存的范围内跳跃。