樂猪
2015-05-25 16:38
var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo();
我自己的理解以为是输出1,但是实验发现是2.
是不是在变量初始化阶段,foo这个函数体内部也会进行赋值操作。我的理解是是把初始化阶段的时候是把foo存储到VO中,然后foo中的代码不会执行。 我以为上面代码中的foo函数体中 var a = 2 这个操作也是 在执行阶段才开始的?
个人理解:
初始化阶段: a:undefined foo:<ref of function>
执行阶段: a:1 foo:function(){ /*function*/};
然后function内开始初始化,初始化后由于没有调用,所以没有执行阶段。
然后foo()调用,开始function内部的执行阶段
这里有两个执行环境,一个是全局,一个是foo函数调用时。
很明显,foo函数调用时,由于有var a,所以不管执行与否都会被提前声明。
所以最外全局的a实际上是被遮蔽了。
foo执行时,a因为是undefined,所以!a为真进入完成a = 2的赋值。
怎么样判断一个变量是全局变量,在控制台中怎么验证啊
JavaScript深入浅出
281112 学习 · 1020 问题
相似问题