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

来源:7-3 [JavaScript]ES3执行上下文

樂猪

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 这个操作也是 在执行阶段才开始的?

写回答 关注

3回答

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

    个人理解:

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

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

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

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

    arlenh... 回复Bosn

    我并不认为理解有误= = 因为输出的a确实是foo的变量a,foo初始化过程a是内部变量值为undefined取非为true,所以赋值2成功并输出了。另外借楼问一下老师ajax跨域后取得url我想赋值url给a标签的href,但是点击a标签后发现浏览器屏蔽了我的打开,谷歌了下是浏览器认为跨域的不安全所以屏蔽,有办法解决吗?http://runjs.cn/code/7ggk5mik

    2015-06-05 11:57:23

    共 5 条回复 >

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

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


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

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


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


    飞过那座山 回复olaola...

    因为函数中a的作用域和全局a的作用域不同,在全局VO中的a在代码执行阶段是被赋值为1

    2016-06-27 18:39:53

    共 3 条回复 >

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

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

JavaScript深入浅出

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

281100 学习 · 1020 问题

查看课程

相似问题