Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript奇数堆栈溢出错误_Javascript_Error Handling_Stack_Stack Overflow - Fatal编程技术网

Javascript奇数堆栈溢出错误

Javascript奇数堆栈溢出错误,javascript,error-handling,stack,stack-overflow,Javascript,Error Handling,Stack,Stack Overflow,我想知道Javascript中括号的工作原理,所以我编写了以下代码来测试: ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

我想知道Javascript中括号的工作原理,所以我编写了以下代码来测试:

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
其中包括:

( x1174
4+4
) x1174
我在Google Chrome 20(Win64)上测试了上面的代码,它给出了正确的答案(
8

但是如果我尝试相同的代码,但是使用1175个括号(两边),我会得到一个stackoverflow错误

您可以签入此代码(注意:在JSFIDLE中,它停止使用1178个括号)

因此,我的问题是:

  • 为什么会这样
  • 为什么它停止在JSFIDLE上使用1178个括号,而在我的空白页面上只使用1175
  • 此错误是否取决于页面/浏览器/操作系统

不同浏览器的行为不同,因为它们有不同的Javascript实现。该语言没有指定这样的东西应该如何失败,因此每个实现都以不同的方式失败


JSFIDLE和空白页面之间的区别在于,JSFIDLE本身使用了一些堆栈框架来建立运行代码的环境。

通常,语言是通过一种称为递归下降的模式设计的代码来解析的。我不确定这里的情况是否如此,但“堆栈溢出”错误无疑是一个重要证据

其思想是,要解析表达式,您可以通过查看表达式可以是什么来接近语法。带括号的表达式类似于“表达式中的表达式”。因此,对于一个解析器来说,要系统地解析它第一次看到的代码中的某个表达式(对于一个解析器来说,这是它永恒的命运),左括号意味着“ok-坚持你正在做的事情(在堆栈上),然后从表达式可能是什么的开头开始,解析一个新的、完整的表达式,然后在看到匹配的close paren时返回”

因此,一个包含一千个或更多括号的字符串触发了相同活动的等效级联:将我们得到的东西放在架子上;潜入并获得一个子表达式,然后在我们知道它是什么样子时继续


现在,这不是解析某些东西的唯一方法,应该注意。有很多方法。我个人非常喜欢递归下降解析,但它没有什么特别之处(除了我认为有一天它会让我看到一只真正的独角兽)。

这个测试是为了什么?有申请吗?只是出于好奇。没有有意义的应用程序顺便说一句,根据(ECMAScript)标准,没有限制(因为产品是递归的)。我已经在Firefox中试用了您的演示。它抛出了“太多的递归”。我不确定为什么这是Chrome中的堆栈溢出错误(嵌套的paren与堆栈有什么关系?)。@ŠimeVidas我认为“太多递归”和“堆栈溢出”几乎是一样的。但是为什么paren会增加堆栈大小?我认为只有函数调用才能做到这一点……谁知道解释器是如何编写的?您可能不是在谈论Javascript堆栈,而是一个C堆栈。语言实现的内部结构可能比你想象的要复杂得多。@ŠimeVidas请看我的答案:-)导致问题的是表达式的解析,而不是计算。