浏览器如何处理JavaScript?

DPD*_*DPD 8 javascript browser

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

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

T.J*_*der 30

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

当HTML解析器到达script元素,所有的解析器不被读取并存储通过结束文本</script>标签(或检索通过引用的文件src属性).然后,除非作者使用了deferasync属性,否则所有HTML解析和渲染都会暂停,HTML解析器将脚本文本移交给JavaScript解释器.JavaScript解释器在window对象的上下文中解释JavaScript代码,并在完成后返回到HTML解析器,然后HTML解析器可以继续解析和显示页面.这个停止 - 所有 - 并且运行JavaScript是为什么一些知名人士建议将脚本放在底部用于改善感知加载时间的页面.它还意味着按顺序script处理标记,如果一个脚本依赖另一个脚本,这可能很重要.如果使用or 属性,则可以将脚本执行推迟到支持它的浏览器上.页面上的所有脚本都在同一个全局执行上下文中执行,共享相同的全局命名空间和内存区域(因此可以相互交互).deferasync

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

正如可以看到的上方,存在其中JavaScript代码可运行两个稍微不同的情况:在页面解析/渲染处理(当script不使用该元素deferasync属性被初始处理),和之后的解析/渲染进程(延迟脚本和为响应事件而运行的代码).在解析/呈现过程中运行的JavaScript可以通过该document.write函数直接将内容输出到HTML解析器.解析/渲染完成后运行的JavaScript当然不能这样做,但可以使用非常强大的DOM HTML API与DOM进行交互.

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

推荐阅读: