You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:13