Dan*_*nte 3 javascript stack-overflow error-handling stack
我想知道Javascript中括号的工作,所以我编写了这段代码来测试:
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
Run Code Online (Sandbox Code Playgroud)
其中包括:
( x1174
4+4
) x1174
Run Code Online (Sandbox Code Playgroud)
我在Google Chrome 20(Win64)上测试了上面的代码,它给了我正确的答案(8).
但是,如果我尝试相同的代码,但有1175个括号(两边),我得到一个stackoverflow错误.
你可以在JSFiddle中检查这段代码(注意:在JSFiddle中它停止使用1178个括号)
所以,我的问题是:
通常,语言由沿着称为递归下降的模式设计的代码解析.我不确定这是否是这种情况,但肯定"堆栈溢出"错误是一个很大的证据.
我们的想法是,要解析表达式,您可以通过查看表达式的内容来处理语法.带括号的表达式就像"表达式中的表达式".因此,对于一个解析器系统地解析它在第一次看到的代码中的某个表达式(对于解析器来说,它是它的永恒命运),左括号意味着"确定 - 保持你正在做的事情(在堆栈上) ),从表达式可能的开头开始,解析一个新的,完整的表达式,当你看到匹配的关闭paren时回来".
因此,一千个或更多个括号的字符串触发同一活动的等效级联:将我们所拥有的东西放在架子上; 潜入并获得一个子表达式,然后在我们知道它的样子时恢复.
现在这不是解析某些东西的唯一方法,应该注意.有很多方法.我个人非常喜欢递归下降解析,但没有什么特别之处(除了我认为它有一天会让我看到一个真正的独角兽).
不同浏览器的行为是不同的,因为它们具有不同的Javascript实现.该语言没有指定这样的事情应该如何失败,因此每个实现都以不同的方式失败.
JSFiddle和您的空白页面之间的区别是因为JSFiddle本身使用一些堆栈帧来建立运行代码的环境.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |