Javascript 我应该在脚本上使用defer吗?该脚本已经位于底部主体标记之前?

Javascript 我应该在脚本上使用defer吗?该脚本已经位于底部主体标记之前?,javascript,html,http,deferred,Javascript,Html,Http,Deferred,每次我把js文件放在页面底部时,这个问题总是困扰着我。如果我将所有js文件放在关闭body标记之前的底部,那么我认为浏览器将首先下载所有html和样式表,然后解析html和css,最后发送js文件请求。所以 对已经位于底部的js文件使用defer会有什么不同吗 非延迟脚本是否在body标记呈现阻塞之前结束 我还有一个问题,如果我把所有的js文件放在头上,然后对它们使用defer。这是否等同于将所有js文件放在底部?在head中看到带有defer的js时,浏览器会向服务器发出请求,然后继续下载

每次我把js文件放在页面底部时,这个问题总是困扰着我。如果我将所有js文件放在关闭
body
标记之前的底部,那么我认为浏览器将首先下载所有html和样式表,然后解析html和css,最后发送js文件请求。所以

  • 对已经位于底部的js文件使用
    defer
    会有什么不同吗
  • 非延迟脚本是否在body标记呈现阻塞之前结束
我还有一个问题,如果我把所有的js文件放在头上,然后对它们使用
defer
。这是否等同于将所有js文件放在底部?在
head
中看到带有defer的js时,浏览器会向服务器发出请求,然后继续下载其余的html文件,还是只在下载所有html和css后才向服务器发出请求

据我所知,
async
相当于
defer
,唯一的区别是js将在下载时执行,而不考虑文件的顺序。所以

  • 在已经位于底部的js文件上使用
    async
    ,除了它们的执行顺序之外,还会有什么不同吗
延迟属性是一个布尔属性

当存在时,它指定在页面完成解析时执行脚本

注意:defer属性仅适用于外部脚本(仅当src属性存在时才应使用)。

通过查看脚本,可以发现W3C使用

我们在这里看到的是,使用
defer
在解析HTML时获取脚本,但在执行之前等待解析结束

另一方面,
async
,在解析的同时进行抓取,一旦抓取完成,HTML呈现将暂停以执行脚本

由于HTML的执行是同步的,因此可以假设对放置在
之前的脚本使用
延迟
几乎就像将它们放置在
之前一样


然而,如前所述,我不会信任
延迟
。我觉得StackOverflow的答案作为一个整体应该更好地解释
延迟
如何影响加载Java脚本。

我发现的这篇文章很好地解释了这一点:


理想情况下,最佳实践是使用Well no。解析页面后,它不会执行脚本。它在解析html文档(DOM)之后,在触发
DOMContentLoaded
之前,按照MDN执行脚本。您还有其他参考资料吗?我从中发现,您应该检查一下。我只发现MDN有一两次错误,但很多次都是错误的。因此,我认为MDN比w3school更值得信赖。是的,defer基本上类似于将标签放在正文的末尾。但是,如果我不使用defer,像gtmatrix这样的许多网站的评分会更低。我想现在现代浏览器应该已经正确地实现了
defer
。也许是这样。考虑到这一点,在
中的脚本上使用
defer
,或者在内容中混合使用
会使它们阻止呈现过程,并且实际上会加快页面呈现时间。但是,它会影响执行时间,这会使
上面的脚本失效。我想在上面的评论中提到。