关于JavaScript的加载顺序以以下一段程序开始:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="jquery-3.3.1.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<!-- 测试js的加载顺序 -->
<script>
var a = "1234";
$(function(){
a = "Hello";
})
var b = a;
var c = "";
function thing() {
c = a;
document.writeln("a :" + a + "<br>");
document.writeln("b :" + b + "<br>");
document.writeln("c :" + c + "<br>");
}
</script>
<button type="button" onclick="thing()">点击打印</button>
</body>
</html>
结果如下图:
在上述程序中,在JavaScript块中先执行全局变量,当DOM加载完后执行 a=“Hello”;,最后点击事件发生后执行thing()函数。
先处理后加载
在一个JavaScript文件或一个JavaScript代码块的内部,浏览器会先对代码进行预处理(编译),然后再执行。
预处理会跳过执行语句,只处理声明语句,同样也是按从上到下按顺序进行的。包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。 即使声明是在调用的下方进行的,但浏览器仍然先声明再调用(执行),这个现象叫做“提升”。所以,即便一个函数的声明在下方,在前面仍然可以正常执行这个函数。
注意1:对于声明并赋值的语句,例如 var a = 1,在预处理阶段会把这句话拆成两句:
var a;
a = 1;
也就是说,赋值或其他逻辑运算是在执行阶段进行的,在预处理阶段会被忽略。
注意2:(1)函数声明的提升优先于变量声明的提升;(2)重复的var声明会被忽略掉,但是重复的function声明会覆盖掉前面的声明。
在预处理阶段,声明的变量的初始值是undefined, 采用function声明的函数的初始内容就是函数体的内容.
转载自:
https://blog.youkuaiyun.com/wnvalentin/article/details/79769393