Javascript奇数StackOverflow错误
Javascript odd StackOverflow error
我想知道Javascript中括号的工作原理,所以我写了以下代码来测试:
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
包括:
( x1174
4+4
) x1174
我在谷歌Chrome 20(Win64)上测试了上面的代码,它给了我正确的答案(8
)。
但是,如果我尝试相同的代码,但两边都有1175个括号,我会得到一个stackoverflow错误。
您可以在JSFiddle中检查此代码(注意:在JSFiidle中,它停止使用1178个圆括号)
所以,我的问题是:
- 为什么会发生这种情况
- 为什么它停止在JSFiddle上使用1178个括号,而在我的空白页上只有1175个
- 此错误是否取决于页面/浏览器/os
通常,语言是由按照称为递归下降的模式设计的代码解析的。我不确定这里是不是这样,但"堆栈溢出"错误无疑是一个很大的证据。
其思想是,要解析表达式,您可以通过查看表达式的内容来处理语法。带括号的表达式就像"表达式中的表达式"。因此,对于一个解析器来说,要系统地解析它第一次看到的代码中的某个表达式(对解析器来说,这是它永恒的命运),左括号的意思是"好吧,坚持你(在堆栈上)正在做的事情,从一个表达式可能的开始,解析一个新的、完整的表达式,当你看到匹配的右括号时再回来"。
因此,一个由一千个或更多括号组成的字符串会触发相同活动的等效级联:将我们所拥有的东西放在架子上;深入研究并获得一个子表达式,然后当我们知道它是什么样子时再继续。
现在应该注意的是,这并不是解析某些内容的唯一方法。有很多方法。我个人是递归下降解析的超级粉丝,但它并没有什么特别之处(只是我认为有一天它会让我看到一只真正的独角兽)。
不同浏览器的行为不同,因为它们有不同的Javascript实现。该语言没有指定类似的东西应该如何失败,所以每个实现都以不同的方式失败。
JSFiddle和空白页之间的区别在于,JSFiddl本身使用了一些堆栈框架来建立运行代码的环境。
- Node.js v6.2.0类扩展不是函数错误
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 我如何修复包含在captcha的addthis中的错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- CKFinder 3为所选文件返回错误的URL
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 铬:“;未捕获的语法错误:意外的标记:"
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 相位器状态未捕获参考错误
- /undefined在我的404错误日志中多次出现
- Javascript未捕获语法错误意外的标识符错误
- javascript:如何在antlr生成的Lexer中进行错误处理
- Angularjs工厂注入错误
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- Javascript奇数StackOverflow错误