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

为什么这段JS代码输出5、undefined、5而非5、undefined、10?

var x = 5;
function y(){
  x=10;
  return
  function x(){}
}
console.log(x);   //5
console.log(y());   //undefined
console.log(x);   //5

这个现象是函数声明提升和**自动分号插入(ASI)**两个JavaScript核心机制共同作用的结果,具体原因拆解如下:

  1. 函数声明会在当前所在作用域顶部完成提升:y函数内部的function x(){}属于函数作用域内的函数声明,在进入y函数、正式执行代码前的编译阶段,就已经在y的作用域内创建了局部变量x,值为这个声明的函数,不需要向上查找全局的x。
  2. 执行y内部的x = 10时,修改的是上面提到的局部变量x,全局作用域的x完全没有被改动,依然保留初始值5。
  3. return后直接换行触发了自动分号插入规则,JavaScript会自动在return后插入分号,相当于实际执行的是return;,后续的代码不会运行,函数直接返回undefined,所以第二个打印结果符合预期。
  4. 最后打印的x是全局作用域下的变量,自然还是初始的5。

如果删除function x(){}这一行,y的函数作用域内就没有局部的x变量,执行x = 10时会向上层作用域查找,最终修改的是全局的x,所以最后打印结果就是10,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:51:03