为何JavaScript变量x为undefined?示例中为何返回undefined而非25?
为什么你的JavaScript代码里x会输出undefined?
这是个经典的**变量提升(Hoisting)**问题,很多刚接触JavaScript的开发者都会踩这个坑,我来给你一步步拆解清楚:
首先得明白JS里var声明的变量有个特殊行为:变量声明会被提升到当前作用域的顶部,但赋值操作会留在原地。也就是说,不管你在作用域的哪个位置用var声明变量,JS引擎都会先把这个声明“提前”到作用域最开头,但变量的赋值还是在原来的位置执行。
现在来看你的代码:
var x = 25; (function() { console.log(x); var x = 10; })();
我们来拆解这个立即执行函数(IIFE)内部的执行顺序:
- 当进入这个局部作用域时,JS引擎首先扫描所有
var声明,把var x提升到作用域的最顶部。此时这个局部的x只是被声明了,还没有赋值,所以默认值是undefined。 - 接下来执行
console.log(x),这里访问的是局部作用域里的x(因为作用域链规则:先找当前作用域的变量,找到就不会往上找全局的了),所以打印出undefined。 - 最后才执行
x = 10,给局部的x赋值为10,但这一步已经在打印之后了,所以不会影响之前的输出。
简单说,你的函数内部代码其实被JS引擎偷偷改成了这样:
(function() { var x; // 声明被提升,值为undefined console.log(x); x = 10; // 赋值留在原地 })();
如果想避免这类问题,现在更推荐使用let和const来声明变量——它们是块级作用域,不存在变量提升(准确说是存在暂时性死区),如果在声明前访问变量会直接抛出错误,能帮你更早发现问题。比如把代码改成这样:
var x = 25; (function() { console.log(x); // 这里会直接抛出ReferenceError,提示x未被初始化 let x = 10; })();
内容的提问来源于stack exchange,提问作者darksoulsong
相关产品推荐
相关产品推荐

