js 当中的预编译

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

var tt = 'aa'; //v1  
function test(){  
alert(tt);  //underfined; 
var tt = 'dd';  //v2
alert(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了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值