为何内层函数中同名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
相关产品推荐
相关产品推荐

