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

为何内层函数中同名var变量声明在console.log后返回NaN?

变量提升导致的var声明执行差异解析

嘿,这个问题的核心其实是JavaScript里的**变量提升(Hoisting)**机制,尤其是var声明的特性在这儿搞的鬼!咱们一步步拆解两个例子来搞明白:

第一个例子的执行过程

先看这段代码:

function outer() {
  var a = 2;
  function inner() {
    a++;
    console.log(a) //log NaN
    var a = 8
  }
  inner()
}
outer()

在inner函数内部,var a = 8这句声明会被提升到当前作用域的顶部,但只有声明被提升,赋值操作=8还留在原来的位置。所以inner函数实际的执行顺序相当于:

function inner() {
  var a; // 变量提升,初始值为undefined
  a++; // undefined + 1 = NaN
  console.log(a); // 输出NaN
  a = 8; // 赋值操作在这儿执行
}

因为inner作用域里已经有了自己的a变量(被提升的声明),所以它不会去外层outer函数找那个值为2的a了,而是操作自己作用域里的undefined值,自然就得到NaN啦。

第二个例子的执行过程

再看这段代码:

function outer() {
  var a = 2;
  function inner() {
    a++;
    console.log(a) //log 3
    var b = 8
  }
  inner()
}
outer()

这里inner函数里声明的是var b = 8,和a没关系。所以当执行a++的时候,inner作用域里找不到a变量,就会向上查找外层outer函数的作用域,找到那个值为2的a。执行a++后,a的值变成3,console.log自然就输出3了,后面的var b =8不会对a产生任何影响。

简单总结一下:var声明的变量会被提升到当前作用域顶部,当内层函数里声明了和外层同名的变量时,内层的变量会“遮蔽”外层的变量,哪怕声明写在后面,提升机制也会让它先存在于内层作用域中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:16