全局变量在函数作用域重声明后返回undefined的原因咨询
为什么这段代码返回undefined而不是你预期的2?
这其实是JavaScript新手很容易踩的**变量提升(Hoisting)**坑,我来一步步给你拆解清楚:
首先先把你的代码贴出来方便分析:
var a = 2; console.log((function(condition){ if (condition) { var a = 4; return a; } else { return a; } })(false));
核心原因:var的变量提升特性
当你在函数内部用var a声明变量时,JavaScript会把这个变量的声明部分(注意只是声明,不是赋值)提升到整个函数作用域的最顶部,不管它写在if分支还是else分支里。也就是说,你的函数实际执行时,逻辑相当于被偷偷改成了这样:
var a = 2; console.log((function(condition){ // 变量a的声明被提升到这里,但还没赋值 var a; if (condition) { a = 4; return a; } else { return a; } })(false));
具体执行流程
- 全局作用域里先声明并赋值了
a = 2; - 立即执行函数被调用,传入
false; - 函数内部首先提升了
var a的声明,此时这个函数作用域内的a是未赋值的状态(值为undefined); - 因为
condition是false,进入else分支,返回当前函数作用域内的a——也就是那个未赋值的undefined; - 这里要注意:函数内部的
var a会覆盖全局的a,因为函数作用域的变量优先级高于全局作用域,所以else分支不会去访问全局的2。
如何得到预期的2?
有两种常见的修改方式:
- 把函数内部的
var a改成let a:let是块级作用域,只会在if分支内部生效,else分支会访问全局的a; - 直接去掉函数内部的
var:这样if分支里的a=4会直接修改全局变量,但这种方式容易造成作用域混乱,不推荐。
内容的提问来源于stack exchange,提问作者user1173169
相关产品推荐
相关产品推荐

