Javascript在浏览器中的加载顺序详解!

现在前端用javascript用的比较多,当然真心的说这个语言是一个非常业余的语言,但是用的人很多,所以也比较火。今天想完成一个javascript外部文件自动加载的设计(类似于java或者php的import和require_once),因此仔细研究了下Javascript的解析顺序,发现要真正的实现javascript的动态加载是无法完美实现的(所以现在所有的js库都会放在一个js文件里面,然后让你在head部分通过src引入)。其实javascript的解析顺序非常的简单,Javascript解析的基本顺序原则是:从上到下,同步解析。也就是解析完前一段javascript代码,才会继续解析后面的代码。如果通过javascript代码动态加载的代码部分,这属于异步解析的,通常会在整个HTML解析完毕之后才会解析动态加载的部分。(IE10,Chrome29,FireFox34上得到验证)。

示例代码如下:

 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 2 "http://www.w3.org/TR/html4/loose.dtd">
 3 <script>window.console.log("html befor...");</script>
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5     <head>
 6         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 7         <script src=‘myjs/autoload.js‘></script>
 8         <title>New Web Project</title>
 9     </head>
10     <script>window.console.log("head after...");</script>
11     <script src=‘myjs/autoload.js‘></script>
12     <body>
13         <script src=‘myjs/HelloDate.js‘></script>
14         <script src=‘myjs/Student.js‘></script>
15         <script>
16             LoadScriptEnd("myjs/HelloDate.js", loadend);
17             LoadScriptEnd("myjs/Student.js",loadend2);
18             function loadend()
19             {
20                 var obj = new HelloDate();
21                 document.getElementsByTagName("h2")[0].innerHTML = obj.GetDateStr();
22
23             }
24
25             function loadend2()
26             {
27                 var stu=new Student("1001","jackwong","man");
28                 document.getElementsByTagName("h3")[0].innerHTML=stu.DispInfo();
29
30             }
31
32
33         </script>
34
35         <h1>New Web Project Page</h1>
36         <h2>this is end!</h2>
37         <h3>this is end2!</h3>
38
39         <script>window.console.log("body script end");</script>
40     </body>
41
42     <script>for(var i=0;i<100000000;i++)m++;</script>
43     <script>window.console.log("body after...");</script>
44 </html>
45 <script>window.console.log("html after...");</script>

以上代码里面LoadScriptEnd函数是动态加载外部 js文件的函数,你的你能说出里面的代码执行顺序吗?

正确的执行顺序应该是:

 1 "html befor..." Jstest.html:3
 2 "autoload begin" autoload.js:1
 3 "autoload end" autoload.js:62
 4 "head after..." Jstest.html:10
 5 "autoload begin" autoload.js:1
 6 "autoload end" autoload.js:62
 7 "HelloDate begin" HelloDate.js:1
 8 "HelloDate end" HelloDate.js:17
 9 "Student begin" Student.js:1
10 "Student end" Student.js:13
11 "LoadScriptEnd begin" autoload.js:33
12 "LoadScriptEnd Return" autoload.js:60
13 "LoadScriptEnd begin" autoload.js:33
14 "LoadScriptEnd Return" autoload.js:60
15 "body script end" Jstest.html:40
16 "body after..." Jstest.html:44
17 "html after..." Jstest.html:46
18 "Student begin" Student.js:1
19 "Student end" Student.js:13
20 "LoadScriptEnd OK" autoload.js:55
21 "HelloDate begin" HelloDate.js:1
22 "HelloDate end" HelloDate.js:17
23 "LoadScriptEnd OK" autoload.js:55
时间: 2024-10-11 22:45:26

Javascript在浏览器中的加载顺序详解!的相关文章

javascript在html中的加载顺序

参考:[1]http://coolshell.cn/articles/9749.html(酷壳) [2]http://shaozhuqing.com/?p=2756 颜色标注分别来自于链接地址内容 通常来说,浏览器对于Javascript的运行有两大特性:1)载入后马上执行,2)执行时会阻塞页面后续的内容(包括页面的渲染.其它资源的下载).于是,如果有多个js文件被引入,那么对于浏览器来说,这些js文件被被串行地载入,并依次执行. 因为javascript可能会来操作HTML文档的DOM树,所以

Spring Boot 配置加载顺序详解

使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:

(转)面试题--JAVA中静态块、静态变量加载顺序详解

1 public class Test { //1.第一步,准备加载类 2 3 public static void main(String[] args) { 4 new Test(); //4.第四步,new一个类,但在new之前要处理匿名代码块 5 } 6 7 static int num = 4; //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定 8 9 { 10 num += 3; 11 System.out.println("b"); //5.第五步,按照顺序加

java中带继承类的加载顺序详解及实战

一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩固! 二.测试步骤: 1.父类代码 1 package com.hafiz.zhang; 2 3 public class Fu 4 { 5 private int i = print("this is father common variable"); 6 private static

web.xml加载顺序详解

web.xml加载顺序 1.先加载<context-param>标签 2.创建servletContext容器 3.把<context-parame>标签中数据转化成键值树交给servletContext容器 4.创建Listener实例 5.加载filter(过滤器) 6.加载Interceptor(拦截器) 7.加载servlet 注:filter加载顺序:根据web.xml中<filter-mapper>来决定 servlet一样如此 1.自定义Listener,

servlet与filter的加载顺序详解

 项目:3个filter,3个servlet,匹配的url路径/hello. 情况1:servlet没加<load-on-startup></load-on-startup>情况(web.xml配置顺序:first filter,second filter,third filter,first servlet,second servlet,third servlet): [html] view plain copy 初始化tomcat时: this is the first fil

dubbo配置文件的加载顺序详解(图示)

Dubbo配置文件的加载顺序 ? 在使用apache dubbo.version2.7.3 时,配置文件的加载情况.以provider提供服务者为例. 配置文件 ,以下四个配置文件. 其优先级 application.properties #Dubbo config dubbo.application.name=boot-ego-user-service-provider dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protoc

C编译器、链接器、加载器详解

摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可加载.可执行代码的过程. 过程图解如下: 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是

jquery插件图片延时加载实例详解(转)

jquery插件图片延时加载实例详解 效果预览:http://keleyi.com/keleyi/phtml/image/index.htm 使用方法:1.导入JS插件 <script src="http://keleyi.com/keleyi/pmedia/jquery-1.9.1.min.js" type="text/javascript"></script> <script src="http://keleyi.com/