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

JavaScript变量声明是如何实现的?var提前打印为何返回undefined而非引用错误

问题原因:JavaScript变量提升(Hoisting)机制

你遇到的运行结果是var声明的变量特有的提升行为导致的,不会抛出ReferenceError的核心原因是:变量在你写的声明语句之前,就已经被JS引擎提前注册到当前作用域了。

JS代码的执行分为预编译和逐行执行两个阶段,对应你的代码具体执行逻辑如下:

  • 预编译阶段:JS引擎会扫描当前作用域的所有声明语句,所有用var关键字声明的变量都会被提前“提升”到当前作用域的最顶部完成声明,该阶段只做声明不做赋值,变量默认初始值为undefined。
  • 逐行执行阶段:你写的原始代码
    console.log(x)
    var x = 10;
    
    实际执行顺序等价于:
    var x = undefined; // 预编译阶段已经完成的操作
    console.log(x); // 此时x已经声明,只是未手动赋值,输出undefined
    x = 10; // 赋值操作在打印之后才执行
    

只有当你访问一个完全没有在任何作用域中声明过的变量时,才会抛出ReferenceError。你这段代码里的x已经在预编译阶段完成声明,所以不会触发报错。

补充说明:ES6引入的let、const关键字也存在变量提升,但和var不同的是,它们在声明语句之前的访问区间属于暂时性死区(Temporal Dead Zone),此时访问变量会直接抛出ReferenceError,如果你把代码中的var替换为let,就会得到你预期的报错结果。

内容的提问来源于stack exchange,提问作者ankita gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:45:04