script标签的defer和async的区别是什么?

193 阅读4分钟

摘自《JavaScript高级程序设计》

1. defer属性

HTMI4.01为<script>标签定义了defer属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。 因此,在<script>元素中设置 defer属性, 相当于告诉浏览器立即下载,但延迟执行。

<!DOCTYPE html> 
<html>
 	<head>
 		<title>exmaple</title>
 		<script type="text/javascript" defer="defer" src="example1.js"></script> 
 		<script type="text/javascript" defer="defer" src="example2.js"></script>
 	</head>
 	<body>
 		内容
 	</body>
 </html> 

说明 在这个例子中,虽然我们把<script>元素放在了文档的<head>元素中.但其中包含的脚本将延迟到浏览器遇到</html>标签后再执行。

HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于事件DOMContentLoaded执行。在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行, 因此最好只包含一个延迟脚本。

适用性 defer 属性只适用于外部脚本文件。这一点在HTML5中已经明确规定, 因此支持 HTML5的实现会忽略给嵌入脚本设置的defer属性。IE4-IE7还支持对嵌入脚本的defer属性,但 IE8及之后版本则完全支持HTML5规定的行为。

IE4、Firefox 3.5、Safari 5和Chrome是最早支持defer属性的浏览器。其他浏览器会忽略这个属性,像平常一样处理脚本。为此,把延迟脚本放在页面底部仍然是最佳选择。

注意 1.不要在defer型的脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。
2.而且,不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。

补充 如果是编写脚本的时候加入defer属性,那么浏览器在下载脚本的时候就不必立即对其进行处理,而是继续对页面进行下载和解析,这样会提高下载的性能。 这样的情况有很多种。比如你定义了很多javascript变量,或者在引用文件(.inc)中写了很多的脚本需要处理,那不妨在这些脚本中加入defer属性,对性能的提高肯定有所帮助。 举例如下:

<script language="javascript" defer>
var object = new Object();
....
</script>

因为defer属性默认是为false的,那么在这里<script language="javascript" defer>显式声明defer属性后等同于<script language="javascript" defer=true> 声明了defer属性之后,需要判断是否有别的变量引用了defer脚本块中的变量,否则的话会导致脚本错误的产生

2. async属性

HTML5为<script>元素定义了async属性。这个属性与defer属性类似,都用于改变处理脚本的行为。同样与defer类似,async只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer 不同的是, 标记为async的脚本并不保证按照指定它们的先后顺序执行。例如:

<!DOCTYPE html> 
<html>
 	<head>
 		<title>exmaple</title>
 		<script type="text/javascript" async src="example1.js"></script> 
 		<script type="text/javascript" async src="example2.js"></script>
 	</head>
 	<body>
 		内容
 	</body>
 </html> 

说明 在以上代码中,第二个脚本文件可能会在第一个脚本文件之前执行。因此,确保两者之间互不依赖非常重要。 指定async属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。 为此,建议异步脚本不要在加载期间修改DOM。 异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。

适用性 支持异步脚本的浏览器有Firefox 3.6 ,Safari 5和Chrome。

注意 在XHTML文档中,要把defer或async属性设置为defer="defer",async="async"(编写XHTML比编写HTML的规则要严格很多)

参考链接:

  1. blog.csdn.net/tianyawudie…
  2. blog.csdn.net/qq_30376375…