当日志后声明的内部函数具有相同的变量名称时,为什么内部函数中的变量返回nan

Cla*_*ude 8 javascript function

这里发生了什么事?如果console.log在内部函数中声明一个变量,则会得到不同的结果

我知道var具有功能范围,内部函数可以从其父级访问变量

function outer() {
  var a = 2;

  function inner() {
    a++;
    console.log(a) //log NaN
    var a = 8
  }
  inner()
}
outer()
Run Code Online (Sandbox Code Playgroud)

function outer() {
  var a = 2;

  function inner() {
    a++;
    console.log(a) //log 3
    var b = 8
  }
  inner()
}
outer()
Run Code Online (Sandbox Code Playgroud)

NaN在第一个示例中返回日志3,在第二个示例中返回日志

jro*_*jro 13

这是由于吊装

的声明a在内部功能被提升到函数的顶部,覆盖外部函数的a,所以aundefined

undefined++返回NaN,因此您的结果。

您的代码等效于:

function outer() {
    var a=2;

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

    inner();
}

outer();
Run Code Online (Sandbox Code Playgroud)

以这种方式重写代码可以很容易地看到正在发生的事情。