js的预编译机制

 技术分享

1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错)

2.js的预编辑:【对定义式函数】直接创建为作用域上的函数变量,并将其值初始化为定义的函数代码逻辑,也就是为其建立了可调用的函数变量。

3.js的预编辑:【对var定义的变量】 会在开始先全部找出来,并且将初始值设为undefined

4.【对上面代码的解释】:第一个yournameundefined:js开始解析时获得了第一行的yourname声明和函数内部的yourname声明,也就是说在函数内部的局部变量里yourname是被声明过的,然后他们被赋予undefined(等待进一步赋值),然而在函数内部时调用在前赋值在后,所以显示的是undefined

5.最后一行仍然是“李战”:js倾向于先在当前作用域中找函数或变量,如果没有的话再到上层去找,以此类推

 

最后贴几个很好的例子:

 1     alert(testNum);  
 2     alert(‘ok‘);  
 3     testNum = 2;  
 4     //testNum未声明,执行报错。  
 5     alert(testNum);  
 6     alert(‘ok‘);  
 7     var testNum = 2;  
 8     //弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。  
 9     testFunc();  
10     function testFunc() {}  
11     alert(‘ok‘);  
12     //弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。  
13     testFunc();  
14     var testFunc = function() {};  
15     alert(‘ok‘);  
16     //testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。  
17 
1819 
20     <\script type="text/javascript">  
21     testFunc();  
22     alert(‘first block‘);  
23     <!--\script-->  
24     <\script type="text/javascript">  
25     alert(‘second block‘);  
26     <!--\script-->  
27     //弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。 
28 
29  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。