最近在学习 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¬)
真心求指教,被这个提升搞到头都大了。
1
luin 2015-04-09 11:31:25 +08:00 1
第一段代码相当于:
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(); |
3
ChiangDi 2015-04-09 11:35:26 +08:00 via Android 1
if 是不会被提升的吧!第一个之所以输出2是因为
函数被提到最上面了,那时候 a 还没定义,所以 if(!a)为真,执行了 a =2。我是这么想的。 |
4
luin 2015-04-09 11:36:23 +08:00 1
因为 if (!a) 这个条件是真值(a 的值是 void 0,因此 a 是假值,!a是真值),所以会执行 a = 2。
|
5
ChiangDi 2015-04-09 11:36:53 +08:00 via Android
好像不太对。
|
7
RoshanWu 2015-04-09 11:41:02 +08:00 1
`function` 先于 `var a = 1` 被解析哟。前者内部在解析的时候,a = window.a = undefined, 后者是个干扰,额呵呵~
想更加深入地了解,请看: http://roshanca.com/2012/traps-in-javascript-part-I/ 话说这个系列写于两年前一直是 part I,这两天一定要逼自己更新了啊啊啊! |
8
aaronlam OP @ChiangDi 感谢,但是按照你这么说,解释器解释后是这样
function foo() { if (!a) { var a = 2; } alert(a); }; var a = 1; foo(); 全局的 var a = 1; 应该还是会被 声明 并 定义。 看了下 4 楼的回答后感觉整个人豁然开朗了。。 |
11
aaronlam OP @RoshanWu 嗯,原来我是被 if 里的 var a 提升坑了。原来提升后 var a = void (); 然后 void(); 代表的是 f alse (ಠ .̫.̫ ಠ)
|
12
iDelicious 2015-04-09 17:49:24 +08:00 1
JS中函数和变量的声明会被提前执行
|