Javascript奇数StackOverflow错误

Javascript odd StackOverflow error

本文关键字:错误 StackOverflow 奇数 Javascript      更新时间:2024-02-29

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

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

包括:

( x1174
4+4
) x1174

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

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

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

所以,我的问题是:

  • 为什么会发生这种情况
  • 为什么它停止在JSFiddle上使用1178个括号,而在我的空白页上只有1175个
  • 此错误是否取决于页面/浏览器/os

通常,语言是由按照称为递归下降的模式设计的代码解析的。我不确定这里是不是这样,但"堆栈溢出"错误无疑是一个很大的证据。

其思想是,要解析表达式,您可以通过查看表达式的内容来处理语法。带括号的表达式就像"表达式中的表达式"。因此,对于一个解析器来说,要系统地解析它第一次看到的代码中的某个表达式(对解析器来说,这是它永恒的命运),左括号的意思是"好吧,坚持你(在堆栈上)正在做的事情,从一个表达式可能的开始,解析一个新的、完整的表达式,当你看到匹配的右括号时再回来"。

因此,一个由一千个或更多括号组成的字符串会触发相同活动的等效级联:将我们所拥有的东西放在架子上;深入研究并获得一个子表达式,然后当我们知道它是什么样子时再继续。

现在应该注意的是,这并不是解析某些内容的唯一方法。有很多方法。我个人是递归下降解析的超级粉丝,但它并没有什么特别之处(只是我认为有一天它会让我看到一只真正的独角兽)。

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

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