试图了解有关延迟和异步的W3C规范?

时间:2017-11-02 19:11:41

标签: javascript html asynchronous w3c deferred

请参阅:https://www.w3.org/TR/html5/scripting-1.html#attr-script-async

该链接将为您提供有关“延迟”和“异步”的W3C规范。他们在谈论它:

  

如果两个属性都不存在,则在用户代理继续解析页面之前,立即获取并执行脚本。

如果您有“script.js”,那么您可以使用它执行以下操作:

  • 下载文件
  • 从缓存中获取文件
  • “读取”它,因为在实际执行代码之前,必须读取文件中的所有代码(否则不能存在提升)
  • 执行代码

我的英语不太好,所以我现在正在思考“被取出”这个词。

  

如果两个属性都不存在,则提取脚本 并立即执行

我看到“被取出”为:

  • 浏览器可以从缓存中获取script.js
  • 浏览器可以下载script.js

是吗?所以他们使用“fetched”,因为如果你说“已下载”则不包括缓存?

我想讨论非缓存情况,所以在这种情况下:

  

如果两个属性都不存在,则下载脚本 并立即执行

我可以这么说吗?如果是,那么我有最后一个问题。

现代浏览器预先加载扫描仪,扫描javascript文件以便提前下载。所以我想:在“HTML解析器”到达脚本标签之前,预装扫描器可能已经完成下载js文件。因此,“HTML解析器”可能会忙于脚本标记之前的其他一些html,而浏览器已经完成了下载。

直到现在这是真的吗?我自己也不确定。但如果这是真的,那么我不理解W3C规范,因为他们说(如果之前的一切都是真的):

  

如果两个属性都不存在,则下载脚本并立即执行

下载后“立即执行”?如果您处于同步环境中,则在执行JavaScript之前,该脚本标记之前的所有html必须位于DOM中。

所以如果所有这一切都是真的,那么我不明白为什么他们会说:“立即执行”?或者预加载扫描器是非官方的,因此W3C在他们的文档中忽略了这一点。那么在这种情况下,W3C规范实际上只适用于旧版浏览器吗? 或者浏览器可以从预加载扫描程序获取脚本,并且会在“HTML解析器”位于脚本标记时发生,也许我必须这样看?

或者我怎么看这个?

1 个答案:

答案 0 :(得分:1)

这是一个完整的标准,准确地描述了什么"提取"手段。 Fetch Standard

除了缓存和下载之外,还必须考虑服务工作者的行为。实质上,通过&#34;立即执行&#34;,这意味着如果缺少async和defer属性,那么脚本必须是在解析器遇到</script>结束标记时存在的DOM上执行。运行脚本时解析器暂停,只有在脚本完成运行后才会恢复。

预加载扫描程序可以导致脚本下载但不能运行。这意味着如果解析器实际处理脚本元素并运行其脚本,脚本将在缓存中(或在其路上)可用。