3

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

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

其中包括:

( x1174
4+4
) x1174

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

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

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

所以,我的问题是:

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

2 回答 2

6

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

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

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

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

于 2012-07-25T00:50:33.230 回答
5

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

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

于 2012-07-25T00:38:03.453 回答