js 当中的预编译

来源:互联网 发布:郭靖黄蓉爱情知乎 编辑:程序博客网 时间:2024/05/17 22:54

今天同事问我一个js的问题

var tt = 'aa'; //v1  function test(){  alert(tt);  //underfined; var tt = 'dd';  //v2alert(tt);  //dd }  test();

alert(tt)此时为什么会是underfined ,因为我也是js新手所以也不知道原因。所以上网找了一下。经过查找我整理了一下原因。

在js中对所有的var变量声明与函数声明都做了预编译,分配了存储单元,但是请注意只有使用var关键字声明的变量无论是局部变量还是全局变量都会预编译,但是在预编译阶段并不会完成初始化操作。在本例中变量tt 和函数test()在编译阶段都做了预编译处理。当执行的时候先对v1处的tt初始化。然后调用test()进入到函数体内部执行。执行alert(tt)语句。因为在预编译阶段已经记录了函数体内v2出的tt的声明,所以编译器会取函数体内部定义的tt(v2),但是tt(v2)只有声明(值为"undefined"),所以alert出来的就是"undefined". 如果没有函数体内的tt(v2)的定义语句,js解释器在函数体内找不到tt的定义,就会往上一层次寻找,本例中就是到函数体外寻找tt(全局变量)的定义,这时的tt已经初始化过了,所以这个时候alert出来就是aa了。

原创粉丝点击