为何同一段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
相关产品推荐
相关产品推荐

