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

函数内用var声明变量为何输出NaN?我的猜想是否正确?

你的猜想完全正确!

这背后的核心原因是JavaScript的**变量提升(Hoisting)**机制,针对var声明的变量表现尤为明显:

第一段代码分析

var a = 1;
function lol(){
console.log(a);
}
lol();

函数lol内部没有声明自己的a变量,JS引擎会沿着作用域链向上查找,最终找到全局作用域中已赋值为1的a,因此输出1。

第二段代码分析

var a = 1;
function lol(){
var a = a + a;
console.log(a);
}
lol();

函数内部用var声明了a,根据变量提升规则,这个声明会被提升到函数作用域的最顶部,但不会提升赋值操作。相当于JS引擎把代码解析成了这样:

var a = 1;
function lol(){
var a; // 声明被提升,此时a的值是undefined
a = a + a; // undefined + undefined = NaN
console.log(a);
}
lol();

这里的a是函数作用域内的局部变量,和全局的a毫无关系,运算后自然输出NaN。

补充:let和const同样存在变量提升,但它们会被放入暂时性死区(TDZ),在声明语句之前访问会直接抛出错误,而不是返回undefined,这是和var的关键区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:18:28