为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

foo();

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

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

正在回答

3 回答

个人理解:

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

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

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

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

0 回复 有任何疑惑可以回复我~
#1

arlenhui

好了,上面证明我和你思路是一样的,那么为什么alert(a)是2呢? 那是因为你在函数内部也定义了一个a,局部变量和全局变量变量名相同但也是不一样的。所以你输出的是function内部的a=2;而不是window.a。他们不会判断覆盖不覆盖
2015-05-28 回复 有任何疑惑可以回复我~
#2

樂猪 提问者

非常感谢!
2015-05-28 回复 有任何疑惑可以回复我~
#3

樂猪 提问者 回复 arlenhui

谢谢。我前几天也在别的地方找到了正确答案,和你说的一样。
2015-05-28 回复 有任何疑惑可以回复我~
#4

Bosn

恭喜你,理解完全错误。。。完全。
2015-06-05 回复 有任何疑惑可以回复我~
#5

arlenhui 回复 Bosn

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

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


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

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


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


2 回复 有任何疑惑可以回复我~
#1

樂猪 提问者

感谢老师解答。 这个例子中 是不是就是if(!a) 当解析器读到这里的时候 她发现有个a 但是这个时候不管是全局还是函数作用域中都还没有a属性,所以她就直接var a 。
2015-06-05 回复 有任何疑惑可以回复我~
#2

olaolaola 回复 樂猪 提问者

var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); alert(a) //1 , 为什么之后再alert(a)外面的没被改变啊。
2016-03-22 回复 有任何疑惑可以回复我~
#3

飞过那座山 回复 olaolaola

因为函数中a的作用域和全局a的作用域不同,在全局VO中的a在代码执行阶段是被赋值为1
2016-06-27 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信