存档

文章标签 ‘function’

javascript 中的全部变量 与 局部变量

2009年9月23日 joyboy 没有评论

因为一个面试题,我今天测试了下,居然我写的答案是错的,下面是大概意思的源程序:

var a = 100;
function showout(){
   var fullrange = 2 * a;
   var a = 200;
   var halfrange = a / 2;
   alert(fullrange);
   alert(halfrange);
}

开始我想的是既然在function里面定义了局部变量 a ,那function外定义的全局变量在function里面是不会起作用的,所以fullrange和halfrange的值应该分别是:400和100。因为当时是笔试,而不是上机(上机也不会出现这问题,呵呵),所以得出这个答案,面试老师看了之后回答是正确结果,我放心了。
但面试还是有几道题没有做出来,回家仔细的想了下,包括这道题,我在电脑上一测试,俺的天,得到fullrange的值居然是NaN,大呼怎么可能…. 于是我反复测试,如果我把function里面定义的:var a = 200;改为:a = 200;那么得出fullrange和halfrange的值的答案分别是:200和100,想了下其实如果我这里这样改的话,那么function里面的a就不是局部变量了,而是全局变量a,改变了全局变量a的值而已,所以得到值也就200和100了。那我就纳闷了,为什么定义了局部变量,而得不到fullrange的值呢,而且是个NaN,说明var fullrange = 2 * a;中a是没有定义的即typeof a为undefined。那么这也只能说明,在JavaScript中的function里面是严格按照顺序执行的,在function里面如果定义了与全局变量名称相同的局部变量,那么function里面引用到这个变量的都以局部变量来处理,用 this.变量名字 或 window.变量名字 才能引用function外部与变量名字相同的全局变量。
这里的全局变量和局部变量搞的很头晕了,我个人认为是:
在JavaScript执行代码之前,先处理变量声明,不管这个变量在什么位置,如果在function中变量显示声明,即变量在赋值语句中出现在左边,但没有用var声明,则把这个变量看成时全局变量。在function中,如果存在着用var声明的局部变量的名称与全局变量的名称相同,那么function中引用这个变量值的时候在应为局部变量的值,除非用this或window来修饰这个变量,才能取到全局变量的值。