Javascript 奇怪的 StackOverflow 错误

标签 javascript error-handling stack stack-overflow

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

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

其中包括:

( x1174
4+4
) x1174

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

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

您可以在 JSFiddle 中查看此代码(注意:在 JSFiddle 中它停止使用 1178 个括号)

所以,我的问题是:

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

最佳答案

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

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

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

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

关于Javascript 奇怪的 StackOverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641177/

相关文章:

javascript - 为什么在我的单页应用程序中获取错误没有堆栈跟踪?

php - $.ajax 发送文件 formdata 和变量

javascript - 使用回调获取图像像素数据

javascript - 仅在某些位置拆分数组,而不在其他位置拆分数组

javascript - 在 div 上制作三 Angular 形

php - 为什么cURL在无效的URL上不返回错误?

error-handling - 如果发生错误,请在jqgrid中的添加对话框中设置消息

c - 函数调用、堆栈

c - 数据结构 : Stack

c++ - 如何在返回后立即释放指针?