浏览器如何处理JavaScript?

时间:2010-11-22 07:02:47

标签: javascript browser

网络浏览器如何处理网页的JavaScript内容? JavaScript内容是否被解析为DOM然后呈现?

我不需要规范,但我需要知道它是如何完成的。请告诉我在网页上处理JavaScript内容的整个过程。

1 个答案:

答案 0 :(得分:30)

网页的script部分由浏览器的JavaScript解释器处理,它可能是浏览器的固有部分,但通常是一个独特的模块,有时甚至是一个完全不同的项目(Chrome使用V8; IE使用JScript; Firefox使用SpiderMonkey;等。)。

当HTML解析器到达script元素时,将读取解析器所执行的 all 并通过结束</script>标记存储文本(或检索通过src属性)。然后,除非作者使用defer or async attributes,否则所有HTML解析和渲染都会暂停,HTML解析器将脚本文本移交给JavaScript解释器。 JavaScript解释器在window对象的上下文中解释JavaScript代码,并在完成后返回到HTML解析器,然后HTML解析器可以继续解析和显示页面。这个停止 - 所有 - 并且运行-JavaScript是页面的一些杰出人物recommend putting scripts at the bottom改善感知加载时间的原因。这也意味着script标签按顺序处理,如果一个脚本依赖另一个脚本,这可能很重要。如果使用deferasync属性,则可以延迟脚本执行,直到稍后支持它的浏览器。页面上的所有脚本都在同一个全局执行上下文中执行,共享相同的全局命名空间和内存区域(因此可以相互交互)。

一旦页面被解析和渲染,就会发生各种事件 - 用户可以点击某些内容,浏览器窗口可以调整大小,鼠标可以移动元素。由于位于script标记而运行的JavaScript代码可以“挂钩”这些事件,请求浏览器在事件发生时调用JavaScript中的函数。这允许JavaScript是交互式的 - 例如,用户点击页面上的元素,浏览器告诉JavaScript解释器它应该在JavaScript代码中运行函数X

正如您在上面所看到的,有两种不同的情况可以运行JavaScript代码:在页面解析/呈现过程中(当script元素不使用defer或<{1}}属性正在初始处理中),解析/呈现过程之后(延迟脚本和响应事件而运行的代码)。在解析/呈现过程中运行的JavaScript可以通过async函数直接将内容输出到HTML解析器。解析/渲染完成后运行的JavaScript当然不能这样做,但可以使用非常强大的DOM HTML API与DOM进行交互。

值得注意的是noscript元素:在启用了JavaScript的浏览器中,document.write元素被完全跳过。在没有JavaScript或禁用JavaScript的浏览器中,完全跳过noscript元素,而是读取script元素。这使得包含仅在呈现页面时在浏览器上启用或不启用JavaScript时才会显示的内容变得容易。

推荐阅读: