脚本的无阻塞加载moduleA.js 代码console.log(“I’m A”);/此处可以放jquery源码使得该文件变大,以便异步加载时看效果/moduleB.js 代码console.log(“I’m B”);同步加载<body> <script src=“moduleA.js” onload=“console.log(‘A loaded’)"></script> <script src=“moduleB.js” onload=“console.log(‘B loaded’)"></script></body>输出I’m AA loadedI’m BA loadeddefer 和 asyncdefer:在文档完成解析后,触发 DOMContentLoaded 事件前执行。如果缺少 src 属性(即内嵌脚本),该属性不应被使用,因为这种情况下它不起作用。对动态嵌入的脚本使用 async=false 来达到类似的效果。async:是否在允许的情况下异步执行该脚本。该属性对于内联脚本无作用 (即没有src属性的脚本)。defer 示例<body> <script defer src=“moduleA.js” onload=“console.log(‘A loaded’)"></script> <script src=“moduleB.js” onload=“console.log(‘B loaded’)"></script></body>输出I’m BB loadedI’m AA loadedasync 示例异步加载<body> <script> loadScript(“moduleA.js”, “async A loaded”); loadScript(“moduleB.js”, “async B loaded”); function loadScript(url, text) { var srcEle = document.createElement(“script”); srcEle.src = url; srcEle.async = true; srcEle.onload = function () { console.log(text); }; document.body.appendChild(srcEle); } </script></body>动态创建的script标签,async默认为true;输出I’m Basync B loadedI’m Aasync A loaded相同之处:加载文件时不阻塞页面渲染使用这两个属性的脚本中不能调用document.write方法有脚本的onload的事件回调不同之处每一个async属性的脚本都在它下载结束之后立刻执行,同时会在window的load事件之前执行。所以就有可能出现脚本执行顺序被打乱的情况;每一个defer属性的脚本都是在页面解析完毕之后,按照原本的顺序执行,同时会在document的DOMContentLoaded之前执行AMD和CMDAMDRequireJS的标准特点:依赖前置、预执行define([’./a’, ‘./b’], function(a, b) { //运行至此,a.js和b.js已经下载完成 //a模块和b模块已经执行完 a.doing(); b.doing();});CMDSeaJS的标准特点:依赖就近、懒执行define(function(require, exports, module) { var a = require(”./a”); //等待a.js下载、执行完 a.doing(); var b = require(”./b”); //等待b.js下载、执行完 b.doing();});referenceAMD 和 CMD 的区别有哪些?