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



这是怎么回事?如果我在内部函数中console.log后声明一个变量,我会得到不同的结果

我知道var有一个功能范围,内部函数可以从他们的父级访问变量

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

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

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

这是

由于吊装

内部函数中的a声明被提升到函数的顶部,覆盖外部函数的a,因此a undefined

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

您的代码等效于:

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

以这种方式重写代码可以轻松查看正在发生的事情。

因为var是通过函数提升的,所以你实际上是在运行undefined++这是NaN。如果在 inner 中删除var a = 8,则代码按预期工作:

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

Javascript具有称为提升的机制。借助这种机制,javascript 将自动获取所有变量定义并将其保留在函数的顶部(无论是外部函数还是内部函数(。因此,在您的情况下,它将仅采用变量定义并将其提升到顶部。吊装后你的代码会是这样的

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

您正在尝试递增未定义的变量。这就是您收到 NaN 错误的原因。因此,如果您在声明(提升(后初始化变量,那么您将得到结果。

它们无法访问内部函数值,因此我们必须全局定义。全局之后,您可以在代码中的任何位置使用 A 值

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

最新更新