js加载的缺点
js的加载是同步的  当加载到js文件时  就阻断了html和css的加载
等js加载完并执行完后  再继续html和css的加载(这里不能并行执行的原因是js也能修改html和css)
但是加载工具方法没必要阻塞文档  这使得js加载会影响页面效率
一旦网速不好  那么整个网站将等待js加载而不进行后续渲染等工作
javascript 异步加载的三种方案
有些工具方法需要按需加载  用到再加载  不用就不加载  所以就使用到了异步加载
1  defer
异步加载  但要等到dom文档全部解析完才会被执行  可以把js写在script标签里
只有IE能用
如  
2  async
异步加载  加载完就执行  async只能加载外部脚本  但不能把js写在script 标签里
W3C标准
如  
因为1、2这两种方法执行时不阻塞页面  但是考虑到兼容性问题  但是这两个方案又不能同时写  所以由此引出了第三种方案
*3  创建script标签  来加载js  可以做到用到再加载  不用不加载
<script>//创建script标签var script = document.createElement("script");//type写不写都行// script.type = "text/javascript";//下面就是异步加载js的过程 执行完下面这行代码后 系统就会下载地址里面的东西了//即开启一个线程去加载script标签script.src = "./index.js";//下载完后 只有把这个script标签添加到页面时才会执行 不然永远不会执行document.head.appendChild(script);</script>
注意如果想执行js文件中的方法 但是这里不能马上执行 因为下载文件需要时间的 可能没下载完
所以就用到了一个方法 下载完再执行方法 即load事件
封装一个兼容性的方法
<script>function loadJS(url, callback) {//url表示导入文件路径 callback表示要调用的文件中的方法名var script = document.createElement("script");script.type = "text/javascript";if (script.readyState) {//IEscript.onreadystatechange = function () {if (script.readyState == "complete" || script.readyState == "loaded") {callback();}}} else {script.onload = function () {callback();}}//如果js文件下载的很快 快到连触发事件的机会都没有 那么下面这行代码就不能写在事件前面//所以我们把它写在了事件后面script.src = url;document.head.appendChild(script);}//注意执行时会先预编译function loadJS 但是不会看函数里面的内容//只有函数被调用时才会看里面的内容 即文件还没加载 我们就想让他执行文件里面的函数//这时如果我们直接传一个函数名进去 系统就会报错 即未定义//所以我们就传个函数引用 然后里面放方法执行 系统读到时并不会读里面的内容loadJS('index.js',function(){test();});</script>
