关于JavaScript中var变量提升与同名重复声明的相关问题咨询
关于var重复声明与变量提升的问题解答
问题1
同一函数内多次用var声明同名变量,不会在提升后形成var a, a;的格式。
- JS在代码执行前的预编译阶段,会扫描当前作用域内所有
var声明,遇到同名变量只会在作用域的变量对象中注册一次,后续的重复声明会直接被忽略。 - 初始化前访问a返回undefined的原因:变量提升只会把声明行为提到作用域顶部,赋值操作仍然留在原来的代码位置执行。预编译结束后,a已经是当前作用域的合法变量,但还没执行任何赋值,默认值就是undefined。
- 输出10的
console.log(a)执行时机在var a = 10之后,此时赋值操作已经执行完成,给已经存在的变量a赋值为10,所以输出10而不是undefined,JS直接取当前变量最新的赋值结果即可。
问题2
是的,JS预编译阶段扫描到同一作用域内多个同名var声明时,会自动剔除冗余的声明,仅保留一个变量供后续代码执行,所有的赋值操作都是针对这同一个变量生效。
示例代码执行逻辑拆解
你给出的示例代码,经过变量提升处理后,实际等效于以下执行顺序:
function myFunc() { // 所有重复的var a声明被合并,只保留一次声明 var a; console.log(a); // 未赋值,输出undefined a = 10; console.log(a); // 已赋值为10,输出10 a = 20; // 冗余的var声明被忽略,只剩赋值逻辑 console.log(a); // 已重赋值为20,输出20 } myFunc();
运行代码的输出结果依次为:undefined、10、20。
内容的提问来源于stack exchange,提问作者javascript lover
相关产品推荐
相关产品推荐

