为何嵌套作用域中v1显示undefined,v2却触发引用错误?
为什么
v1输出undefined而v2抛出引用错误? 这其实是JavaScript里**变量提升(Hoisting)**机制在搞鬼,尤其是var声明的变量和未声明变量的区别,咱们一步步拆解来看:
1. var的变量提升特性
先看你的代码里的v1:
(function(){ console.log(`v1: `,v1); // 输出 "undefined" if (true) { var v1 = 'something'; } })();
JavaScript在执行函数代码之前,会先做「预编译」处理:所有用var声明的变量,会被提升到当前函数作用域的顶部,但变量的赋值操作会留在原来的位置。所以这段代码在预编译后,实际相当于:
(function(){ var v1; // 变量提升到作用域顶部,此时未赋值,默认是undefined console.log(`v1: `,v1); // 自然输出undefined if (true) { v1 = 'something'; // 赋值操作留在原位置 } })();
哪怕v1是在if代码块里用var声明的,因为var没有块级作用域(只有函数作用域和全局作用域),所以它的作用域是整个函数,预编译时就被提升到了函数顶部,所以你在console.log的时候,v1已经是存在的变量了,只是还没赋值,所以输出undefined。
2. 未声明变量的行为
再看v2:
console.log(`v2: `,v2); // 抛出 "Uncaught ReferenceError: v2 is not defined"
v2从头到尾都没有用var/let/const声明过,JavaScript引擎在当前作用域(以及上层作用域)里找不到任何关于v2的声明,当你尝试访问一个从未被声明的变量时,就会直接抛出ReferenceError错误,告诉你这个变量根本不存在。
简单总结一下:
- 用
var声明的变量会被提升到作用域顶部,存在但未赋值时是undefined - 未声明的变量在访问时会直接触发引用错误
内容的提问来源于stack exchange,提问作者AmerllicA
相关产品推荐
相关产品推荐

