概览

无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长。浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能会改变页面或 JavaScript 的命名空间,它们对后面页面内容造成影响。一个典型的例子就是在页面中使用document.write()。例如清单 1

清单 1 JavaScript 代码内嵌示例


    Source Example


    

             document.write("Today is " + (new Date()).toDateString());          

当浏览器遇到                    

Hello world!

然而这种常规的做法却隐藏着严重的性能问题。在清单 2 的示例中,当浏览器解析到           

这段代码展示了在 HTML 文档中放置

带有 defer 属性的              alert("script");                   window.onload = function(){             alert("load");         };     

这段代码在页面处理过程中弹出三次对话框。不支持 defer 属性的浏览器的弹出顺序是:“defer”、“script”、“load”。而在支持 defer 属性的浏览器上,弹出的顺序则是:“script”、“defer”、“load”。请注意,带有 defer 属性的