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

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


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


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


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


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


  如果两个属性都不存在,那么将立即获取并执行脚本


我看到“被提取”为:


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


那正确吗?因此他们使用的是“提取的”,因为如果您要说“下载的”,那是不包括缓存?

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


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


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

现代浏览器具有预加载的扫描程序,可扫描javascript文件以预先下载。所以我想:也许在“ HTML解析器”到达脚本标签之前,预加载扫描程序已经完成了js文件的下载。因此,在浏览器已经完成下载的同时,“ HTML解析器”可能会忙于script标记之前的其他html。

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


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


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

因此,如果所有这些都是真的,那么我不明白为什么他们会说:“立即执行”?还是预加载扫描仪是非官方的东西,因此W3C在其文档中忽略了这一点。那么,在这种情况下,W3C规范实际上仅适用于较旧的浏览器吗?
还是浏览器可以从预加载扫描仪中获取脚本,而这种情况会在“ HTML解析器”位于script标签的那一刻发生,也许我必须那样看?

还是我必须看到这个?

最佳答案

有一个完整的标准可以准确描述“获取”的含义。 Fetch Standard

除了缓存和下载外,还必须考虑服务工作者的行为。实质上,通过“立即执行”,这意味着如果缺少async和defer属性,则必须在DOM上执行脚本,因为该脚本存在时解析器遇到</script>结束标记。解析器在脚本运行时暂停,并且仅在脚本运行完成后才恢复。

预加载扫描程序可能导致脚本下载但无法运行。这意味着,当解析器实际处理脚本元素并运行其脚本时,脚本将在缓存中(或其途中)可用。

关于javascript - 试图了解有关延迟和异步的W3C规范?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47082962/

10-12 12:28