JavaScript Hoisting 的问题

2015-04-09 11:28:22 +08:00
 aaronlam

最近在学习 JavaScript 然后刚好碰到这个神奇的问题,百思不得其解:

var a = 1;

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

foo();

结果:2

上面的 function foo() 中的 alert 弹出了 2 ,应该是说明了 if 里的 var a 被提升了。但是提升不是只提升 变量的声明 吗?想问为什么 a 被成功赋值为 2 了?(ಠ .̫.̫ ಠ)

然后我尝试把 if 的条件改为了 false 后:

var a = 1;

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

foo();

结果:undefined

说好的提升呢?(☍﹏⁰) 不提升好歹也弹出全局变量的 1 把?为什么是 undefined????(♩¬3¬)

真心求指教,被这个提升搞到头都大了。

2669 次点击
所在节点    JavaScript
12 条回复
luin
2015-04-09 11:31:25 +08:00
第一段代码相当于:
var a = 1;

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

foo();

更进一步:

var a = 1;

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

foo();
aaronlam
2015-04-09 11:34:32 +08:00
@luin 感谢回答!!!!
我知道 if 里的 var a 会被提升。但是为什么 a = 2 也被成功的执行了呢?
ChiangDi
2015-04-09 11:35:26 +08:00
if 是不会被提升的吧!第一个之所以输出2是因为
函数被提到最上面了,那时候 a 还没定义,所以 if(!a)为真,执行了 a =2。我是这么想的。
luin
2015-04-09 11:36:23 +08:00
因为 if (!a) 这个条件是真值(a 的值是 void 0,因此 a 是假值,!a是真值),所以会执行 a = 2。
ChiangDi
2015-04-09 11:36:53 +08:00
好像不太对。
ChiangDi
2015-04-09 11:38:23 +08:00
@luin 的回答是正解。
RoshanWu
2015-04-09 11:41:02 +08:00
`function` 先于 `var a = 1` 被解析哟。前者内部在解析的时候,a = window.a = undefined, 后者是个干扰,额呵呵~
想更加深入地了解,请看: http://roshanca.com/2012/traps-in-javascript-part-I/

话说这个系列写于两年前一直是 part I,这两天一定要逼自己更新了啊啊啊!
aaronlam
2015-04-09 11:43:01 +08:00
@ChiangDi 感谢,但是按照你这么说,解释器解释后是这样

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

var a = 1;

foo();

全局的 var a = 1; 应该还是会被 声明 并 定义。
看了下 4 楼的回答后感觉整个人豁然开朗了。。
aaronlam
2015-04-09 11:43:13 +08:00
@luin 感谢!!!!
ChiangDi
2015-04-09 11:53:14 +08:00
@aaronlam 对的,我理解错了, luin 那个是正解。
aaronlam
2015-04-09 12:15:23 +08:00
@RoshanWu 嗯,原来我是被 if 里的 var a 提升坑了。原来提升后 var a = void (); 然后 void(); 代表的是 f alse (ಠ .̫.̫ ಠ)
iDelicious
2015-04-09 17:49:24 +08:00
JS中函数和变量的声明会被提前执行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/182527

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX