全局variables值在堆栈超过by node.js中的无限想念recursion后神秘地重置

我想在node.js(v0.4.10)中使用全局值递增来计算无限recursion函数的步骤。 然而,伯爵总是假装为零

> c = 0 > (function f() { c++; console.log(c); f() })(); 1 2 ... 18648 RangeError: Maximum call stack size exceeded > c 0 

从函数内部将c值logging到控制台显示值实际上是递增的,但是不知何故它在堆栈事故之后最终被重置。 即使使用global.c而不是c

这是正确的行为吗? 这里发生了什么? 例如在铬(v14)中, c按预期保持最终计数。

UPDATE

原来以上只在交互模式下才有效。 当代码从文件中被执行,并且try-catch块中包含的函数(以防止提前退出)时,c值是正确的。

 c = 0; try { (function f() { c++; f() })(); } catch(e) {}; console.log(c); 

然而,交互式node.js和铬javascript控制台之间还是有一些差别,其中的值存在未处理的exception

每个交互模式的行为与JavaScript文件的标准执行有一点不同(Isaac Schlueter在某处写道:“ 我从来没有见过一个没有至less有一点点魔力的REPL ”)。 交互模式必须评估文本,通常在不同的上下文中运行代码。

在Node.JS的情况下,每个命令都在它自己的上下文中执行,那么REPL会小心地将结果返回给我们。 如果由于某些错误而导致命令失败,那么我们的variables的值保持不变(因为在执行的上下文中改变的variables“死亡”)。 当我们运行JavaScript文件标准的方式,我们没有这个独立的执行上下文,我们直接改变我们的variables。

你可以改变你的例子手动创build一个错误,并发挥它的智慧:

 c=0; (function f(x){ c++; if(x) f(x-1); else throw new Error(); })(10); 

只要代码执行时出现错误, c的最终值将在REPL中为0。 由于错误,REPL无法将c全局值更新为在我们的testing函数的执行上下文中计算出的值。