这是相对比较值得关注的内容,要知道浏览器对JS的解析都是通过他们自带的一些引擎来牏的。比如chrome所谓的V8引擎,都会有针对性的进行加速和处理,再者比如说IE对JS的规范支持又是比较延后的。因此,了解一下各个浏览器对JS代码执行的限制等,对于开发中遇到的问题也会有一定的了解。。
好吧,原文来自于:“http://rockux.com/archives/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%AF%B9javascript%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E7%9A%84%E9%99%90%E5%88%B6”
浏览器的用户界面和JavaScript代码共享同一个处理进程。无论是浏览器需要响应一个菜单的点击,还是渲染一个页面或者执行Ajax请求,每一个事件都会添加到一个队列中。当浏览器空闲的时候,就会继续执行队列中的任务。
浏览器的线程
实际上,在高端一些的浏览器中都不是只有一个线程。作为极端的例子,IE9和Chrome会为每一个tab生成一个系统的进程。然而,对于每一个页 面来说,仍然只有一个事件处理的队列,也就意味着一次只能执行一个任务。这很必要,因为浏览器或者你的JS都可能会去更改HTML的内容。
不难理解,浏览器必须要限制你的JS执行的时间。如果执行时间很长,会锁死进程甚至导致系统崩溃。这就是你会看到这个“无响应的脚本”的对话框原因。
但是浏览器怎么来决定一个代码是不是执行的时间超长了呢?正如你所想的,5个流行的浏览器的处理方式都不一样。
IE
IE对JS代码的限制是500万条。
Firefox
FireFox使用时间来限制,最多是10秒。
Safari
Safari也是限制5秒。
Chrome
Chrome没有特别的限制,但是他会去检测浏览器是否崩溃或者没有响应。
Opera
Opera也没有限制。但是浏览器不会引起系统的崩溃,你在这个停止响应的时候还可以继续开Tab。
有的浏览器允许你自己配置限制的数额,但是不推荐这样改。这样有的人可能用这种办法来修复“不能响应”的页面。你可以搜一下,但是通过修改浏览器的配置来解决响应的问题不是最终的解决办法。
那么如何才能防止JavaScript抛出这样的错误呢?最佳的解决办法就是避免在客户端执行需要长时间运行的函数。理想情况下,所有的函数都应该在几十毫秒内解决问题。更多更复杂的计算应该交给后端然后通过刷新页面或者异步方法来处理。
然而,我们应该意识到减少客户端的压力在现在这种JS大型应用中不是最佳的办法。还有一些别的办法,我们后面会讲到。