问答详情
源自:7-3 [JavaScript]ES3执行上下文

老师,有一段代码 和EC相关,但是看了有些不明白

var a = 1;
function foo() {
    if (!a) {
       var a = 2;
    }
    alert(a);
};

foo();

我自己的理解以为是输出1,但是实验发现是2.

是不是在变量初始化阶段,foo这个函数体内部也会进行赋值操作。我的理解是是把初始化阶段的时候是把foo存储到VO中,然后foo中的代码不会执行。 我以为上面代码中的foo函数体中 var a = 2 这个操作也是 在执行阶段才开始的?

提问者:樂猪 2015-05-25 16:38

个回答

  • arlenhui
    2015-05-27 23:52:03
    已采纳

    个人理解:

    初始化阶段: a:undefined foo:<ref of function>

    执行阶段: a:1 foo:function(){ /*function*/};

    然后function内开始初始化,初始化后由于没有调用,所以没有执行阶段。

    然后foo()调用,开始function内部的执行阶段

  • Bosn
    2015-06-05 10:43:06

    这里有两个执行环境,一个是全局,一个是foo函数调用时。


    很明显,foo函数调用时,由于有var a,所以不管执行与否都会被提前声明。

    所以最外全局的a实际上是被遮蔽了。


    foo执行时,a因为是undefined,所以!a为真进入完成a = 2的赋值。


  • 慕前端8664132
    2016-07-31 22:53:02

    怎么样判断一个变量是全局变量,在控制台中怎么验证啊