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

为何同一段JavaScript代码中两个alert输出值不同?求执行逻辑

解惑:两个alert输出值不同的原因

嘿,这个问题其实是JavaScript作用域机制的经典体现,你猜的没错,核心就是作用域链和变量查找规则在起作用!

我猜你的代码大概是类似这样的(完全符合你描述的输出结果):

var num = 1; // 全局作用域的变量

function outer() {
  var num = 3; // outer函数作用域的变量
  
  function inner() {
    alert(num); // 第一个alert,输出"3"
  }
  
  inner();
}

outer();
alert(num); // 第二个alert,输出"1"

我们一步步拆解执行逻辑,就能明白差异的根源:

  • 首先,全局作用域里声明了var num = 1,这个变量挂载在全局对象上(比如浏览器环境里的window)。
  • 调用outer()函数时,进入outer的函数作用域,这里又声明了一个同名的var num = 3。JavaScript的变量查找规则是:当访问变量时,会优先从当前作用域开始查找,如果找不到,就沿着作用域链逐层向上查找,直到全局作用域。
  • inner函数是在outer内部定义的,它的作用域链包含outer的作用域和全局作用域。当inner里执行alert(num)时,先在自身作用域查找(这里inner没有自己的num变量),接着找到outer作用域里的num=3,所以第一个alert输出3。
  • 当outer执行完毕回到全局作用域后,执行alert(num)时,此时查找的是全局作用域里的num=1,自然就输出1了。

补充个小知识点:如果把outer里的var num去掉,那两个alert都会输出1——因为此时inner里的num会沿着作用域链直接找到全局的num;反过来,如果删掉全局的var num,第二个alert会直接报错num is not defined,因为全局作用域找不到这个变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:28:03