【问题标题】:Javascript odd StackOverflow errorJavascript奇怪的StackOverflow错误
【发布时间】:2012-07-23 09:06:51
【问题描述】:

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

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

其中包括:

( x1174
4+4
) x1174

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

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

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

所以,我的问题是:

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

【问题讨论】:

  • 这个测试的目的是什么?有什么应用吗?
  • 只是为了好奇。无重要应用
  • 顺便说一句,根据(ECMAScript)标准,没有限制(因为PrimaryExpression生产是递归的)。
  • 我已经在 Firefox 中尝试过你的演示。它抛出“太多递归”。我不确定为什么这是 Chrome 中的堆栈溢出错误(嵌套括号与堆栈有什么关系?)...
  • @ŠimeVidas 我认为“递归过多”和“堆栈溢出”几乎是一回事。

标签: javascript error-handling stack stack-overflow


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是为什么parens会增加堆栈大小?我认为只有函数调用才能做到这一点......
    • 谁知道解释器是怎么写的?您可能不是在谈论 Javascript 堆栈,而是 C 堆栈。语言实现的内部结构可能比你想象的更加巴洛克。
    • @ŠimeVidas 看到我的回答 :-) 导致问题的是表达式的解析,而不是评估。
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多