一,预编译和执行
1,正常执行
alert('start') alert('end');
2,先定义变量 a ,再引用,执行正常
alert('start') var a='hello'; alert(a); alert('end');
3,没有定义 a 变量,直接报错不会再执行
alert('start') alert(a); alert('end');
4,定义放在引用之后,也能执行下去,但是变量是 undefined,而不是 hello
alert('start') alert(a); var a='hello'; alert('end');
为什么会这样呢?
就是因为 js 执行前有预编译的动作
预编译会先把全局变量放到内存中,并赋值为 undefined ,等到执行时再按原来逻辑顺序赋值
但是引用比真正的赋值逻辑执行得更早,所以引用变量就是预编译时的默认值 undefined
二,赋值式函数和声明式函数
1,正常执行
var param_fun=function(){ alert('param_fun'); } alert(param_fun); param_fun();
2,跟之前的变量没定义前就使用一样的情况,赋值式函数把函数当做变量来预编译处理,放到内存中,并定义为 undefined,等到执行时才初始化变量函数里的内容
alert(param_fun); param_fun(); var param_fun=function(){ alert('param_fun'); }
3,声明式函数即使定义放在引用之后,也可以正常执行,可知 js 预编译时不仅把全局变量放到内存,也把全局的声明式函数放到内存中,并对函数进行了初始化,函数可以在定义语句之前引用
org_fun(); function org_fun(){ alert('org_fun'); }
三,按照代码块顺序执行
1,
<script type="text/javascript"> alert("代码块一"); var one = "代码块一变量"; alert(one); </script> <script type="text/javascript"> alert("代码块二"); alert(one); </script>
先执行代码块一,再执行代码块二,而且后面的代码块可以引用前面代码块的变量;
2,
<script type="text/javascript"> // 变量引用在定义前,预编译时默认为 undefined alert(one); alert("代码块一"); var one = "代码块一变量"; </script> <script type="text/javascript"> var two='代码块二变量'; alert("代码块二"); // 由于代码块一执行出错,test 变为 undefined alert(one); </script>
代码块里内容依然遵循预编译和执行原则
3,
<script type="text/javascript"> // two 在代码块一没有定义,所以没有预编译,运行执行报错 alert(two); alert("代码块一"); var one = "代码块一变量"; </script> <script type="text/javascript"> var two='代码块二变量'; alert("代码块二"); // 由于代码块一执行出错,test 变为 undefined alert(one); </script>
代码块二的变量在代码块一没有定义,所以没有预编译,运行执行报错
跟上面执行结果对比,在代码块一执行时,代码块二并没有预编译;
而且代码块一执行报错后,就直接跳过改代码块,继续执行下一个代码块;
由此看出,每个代码块编译完后就执行了,而且按代码块顺序一块块地编译和执行,不是全部代码块编译完之后才执行;
Leave a Reply