函数内用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
相关产品推荐
相关产品推荐

