129   JS

一,预编译和执行



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

Your email address will not be published. Required fields are marked *