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

为什么下述JS代码片段执行输出undefined而非预期的test?

输出undefined的核心原因

这个运行结果是JavaScript中var关键字的变量提升(Hoisting)特性,配合作用域就近查找规则导致的。

实际执行逻辑拆解

JS引擎在执行函数前,会先扫描当前函数作用域内所有用var声明的变量,将变量声明部分提升到函数作用域的最顶部,赋值操作保留在代码原位置不动,且var声明的未赋值变量默认初始值为undefined。
你提供的原始代码在运行时会被隐式转换为如下逻辑:

// 全局作用域
var name = "test";

function message() {
  // 函数内var name的声明被提升到作用域顶部,初始值为undefined
  var name;
  console.log(name); // 访问当前函数作用域的name,值为undefined
  name = "test 2"; // 原位置的赋值,执行到此处局部name才会被更新为"test 2"
}

message();

为什么没有访问到全局的"test"

JS的变量查找遵循就近优先原则:访问变量时会从当前执行上下文的最近作用域开始查找,一旦找到匹配的变量就直接使用,不会继续向外层作用域遍历。
由于你在message函数内部声明了同名的局部变量name,执行console.log(name)时,引擎直接命中了函数作用域内刚被提升、还未完成赋值的局部name,不会向外访问全局作用域中值为"test"的同名变量,因此最终输出undefined。

拓展说明

  • 如果将函数内的var替换为let/const,运行时不会输出undefined,而是直接抛出ReferenceError:let/const声明的变量存在暂时性死区,在声明语句执行前访问变量会直接报错,不会像var一样默认初始化为undefined。
  • 如果想要得到预期的test输出,只需要删除函数内部的var name = "test 2"语句,函数作用域内不存在同名局部变量时,引擎就会向外层全局作用域查找,拿到值为"test"的全局name。

内容的提问来源于stack exchange,提问作者Docu Care

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:54:18