Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

IE8 那脆弱的调用堆栈

  最近莫名其妙地就被「堆栈溢出」坑了好几回,而且是在代码逻辑正常的情况下出现的。好好想想也觉得自己的代码确实越来越 lisp 化了。明明一个循环就能解决的东西,由于懒得给变量起名就直接用了递归来处理。结果递归太深,在 IE8 上堆栈溢出了。
  我写代码的时间有一半都是在思考命名,然而我最讨厌的事情就是命名。既然很多时候使用递归可以减少命名,于是我的代码里总是一坨坨的递归(以至于常常被吐槽难以阅读)。
  也许用递归来逃避命名确实不是什么好主意,我可能会考虑一下写点正常的代码。可既然被 IE8 坑地这么惨,要是还不黑一黑 IE8,总感觉心里憋得慌。其实这些出现「堆栈溢出」的代码,在 Chrome 和 Firefox 上确实没有任何问题,甚至在 IE11@Windows7 的 IE8 模式上都无法重现。只有在真正的 IE8@XP 上才会出现。因为在这古老的 IE8 上,JavaScript 的性能和现代浏览器差了两个数量级,特别是在包含 new 的递归中,几乎 1E3 深度的递归都可以把它跑挂,可见其脆弱程度。
  以前在做一些算法类的东西时也被「堆栈溢出」坑过,比如排序算法。后来在实现时直接通过自己造一个堆栈把递归干掉。虽然这个办法可以干掉递归,避免堆栈溢出,但是在 IE8 上依然可能造成下面这个问题:

  踩了这么多坑,现在也觉得,写太销魂的递归代码虽然逼格高,但不是个好方向。即便人类能理解递归,但编译器性能之类的问题总会有坑,所以以后还是正常点吧?
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^