var a=undefined;
(function(){
var a; //局部变量a,默认值是undefined
a = 5; //因和局部变量名相同,因此全局变量a被覆盖,此处变成了给局部变量a赋值
//alert(a); 弹出5
//a只是变量,而不是属性 alert(a in window)返回false ,参见http://segmentfault.com/q/1010000002883076 的第一个回答
alert(window.a);
a = 10;
alert(a);
})();
第一个 a=5 没用var, 它并没有创建变量a, 而是向上级作用域找变量a, 自然是找不到, 所以会创建a, 但创建的a是本域的, 不是window域(顶级域)的, 所以window.a还是undefined .
首先明确2点:
1、js中没有带
var
关键字的变量都是隐式全局变量2、js中存在变量提升
上述的代码等效于:
可以查看该问答 http://segmentfault.com/q/1010000002589542
因为a在下面被声明过了,所以预解释为undefined,window.a之前a没有赋值,所以为undefined,下面的a声明并且赋值所以为10
@不写代码的码农 首先他的回答已经很好了,希望你明白,作为初学者,说说我个人的比较通俗的理解,望指正。
其中,我不明白的地方提出来了,可能有误,希望指正。-----初学
你可以把那个未声明的变量a当作不存在 这样就会好一些
(function(){
})();
需要知道js的预编译模式的函数声明会先找到变量赋值语句,并将其置于函数顶,赋值为undefined.
了解完这个自己就能读懂了, 虽然
a=5
看上去是声明了一个全局变量,但是后面有一个var a = 10
所以导致变量提升,所以代码预编译完成之后会变成下面这个样子: