一个小例子理解js异步加载

前几天笔试某公司有这样一道题。编写一个javascript函数,可以在页面上异步加载js,在加载结束后执行callback,并在IE和chrome下可以执行。

就这个题我写了一个DOM方法异步加载js的例子,可以给对于异步不了解的朋友参考感受一下。

众所周知,js是一种单线程的语言,它的Event Loop机制可以看一下阮一峰的这篇博客,讲解的很好

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

下面看一下我写的例子

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>js异步加载</title>
 5     <meta charset ="UTF-8">
 6 </head>
 7 <body>
 8
 9 </body>
10  <script type="text/javascript" src="js/call.js"></script>
11 </html>

在html的<script>标签里面的代码或者src引用的文件中的代码都是同步加载的。例子里面call.js就是同步加载。

call.js

 1 function loadScript(url, callback) {
 2     var script = document.createElement("script")
 3     script.type = "text/javascript";
 4     if (script.readyState) { //IE
 5         script.onreadystatechange = function() {
 6             if (script.readyState == "loaded" ||
 7                 script.readyState == "complete") {
 8                 script.onreadystatechange = null;
 9                 callback();
10             }
11         };
12     } else { //Others: Firefox, Safari, Chrome, and Opera
13         script.onload = function() {
14             callback();
15         };
16     }
17     script.src = url;
18     console.log("在appendchild之后xx.js执行");
19     document.body.appendChild(script);
20 }
21 var url1 = ‘js/11.js‘;
22 var url2 = ‘js/12.js‘;
23 function back1(){
24     console.log("back1回调函数被执行");
25 }
26 function back2(){
27     console.log("back2回调函数被执行");
28 }
29 function hello(){
30     console.log("hello world!这是一个普通的同步函数");
31 }
32 loadScript(url1,back1);
33 hello();
34 loadScript(url2,back2); 

11.js

console.log("这是11.js被执行");

12.js

console.log("this is 12.js ");

现在让我们看一下运行结果:

先看一下我们调用函数的顺序

loadScript(url1,back1);
hello();
loadScript(url2,back2);

如果按照同步执行的话我们猜测的寻常结果应该是:

在appendchild之后xx.js执行

back1回调函数被执行

hello world!这是一个普通的同步函数

在appendchild之后xx.js执行

back2回调函数被执行

当然,结果不可能这样,因为我们采取了异步。

xx.js会在appendChild执行之后异步加载执行。

看一下运行结果思考一下异步吧~~

时间: 2024-12-29 12:16:53

一个小例子理解js异步加载的相关文章

页面优化——js异步加载

同步加载 在介绍js异步加载之前,我们先来看看什么是js同步加载.我们平时最常使用的就是这种同步加载形式: <script src="http://XXX.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行.一般的script标签(不带async等属性)加载时会阻塞浏览器,也就是说,浏览器在下载或执行该js代码块时,后面的标签不会被解析,例如在he

JS异步加载的三种方式

js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常模式下下,JS是同步加载的,即优先记载JS,只有当JS文件下载完,dom和css才开始加载,当某些事后我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可 1.defer:defer JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才异步执行 仅I

点评js异步加载的4种方式

主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <html> <head> <script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script> <script typ

JS异步加载的几种方式

一:同步加载 我们平时使用的最多的一种方式. <script src="http://yourdomain.com/script.js"></script> <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作.所以默认同步执行才是安全的.但这样如果js中有输

现代浏览器JS异步加载方案

好,不说废话,要凌晨了我快点写完,关于JS加载阻塞之类的不做科普,本文也不讨论IE9以下的浏览器. headjs:"异步.并行加载并按你的顺序执行",这个是最符合广大码农需求的,只是它越来越臃肿,连CSS Respone什么的都加进去了,没必要那么复杂 Loadjs:今天刚刚出现在OSC首页本人疯狂测试后发现,如果需要并行加载就是乱序的(哪个JS先下载完就先执行谁),如果要顺序下载就不能并发,经测试是下载一个执行一个,每个JS文件之间有10ms的空隙(JS下载和加载时所有渲染操作都要暂

演化理解 Android 异步加载图片

图片加载的几种方法如下: 下面测试使用的layout文件: 简单来说就是 LinearLayout 布局,其下放了5个ImageView. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical

JS -- 异步加载进度条

今天在博客园问答里面看到博友问道怎么实现Ajax异步加载产生进度条. 很好奇就自己写了一个. 展现效果: 1) 当点击Load的时候,模拟执行异步加载. 浏览器被遮挡. 进度条出现. 实现思路: 1.当用户点击load button执行异步请求. 调用方法 出现加载条 2.怎么实现进度条呢? 1) 在document.body 新增一个div.覆盖浏览器. 设置背景会灰色. z-index = 999. 加载的时候让用户无法修改界面值 2) 在document.body 新增一个动态的div.

js异步加载

加载顺序是怎样的? 动态的和静态的都加载完之后才执行ready 还是只有静态的加载完之后就执行了? 页面加载完成之后是指什么才是完全加载完? 什么是并行,什么是异步 脚本的加载应该与文档的加载同时进行,并且不影响DOM的渲染. 文档加载?DOM加载 async属性是HTML5新增的.作用和defer类似,即允许在下载脚本的同时进行DOM的渲染.但是它将在下载后尽快执行(即JS引擎空闲了立马执行),不能保证脚本会按顺序执行.它们将在onload 事件之前完成. 异步加载的三种方式 http://w

Angular.js 与script.js 异步加载

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>angular.js</title> <script type="text/javascript" src="./js/script.js"></script> <!--<script type="text/ja