需要帮助理解下面的 IIFE 代码是如何工作的

Need help understanding how the below IIFE code works

我最近在一个竞争网站上看到了这段 javascript 代码,但无法理解它的工作原理。

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

我预计输出是..

1 2

但令我惊讶的是,原始输出是..

undefined 2

有人可以解释一下它是如何工作的吗?提前致谢。

变量 a 的声明被带到范围的顶部。这个过程称为提升。

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

考虑一个没有 IIFE 和全局变量的通用代码段。

function func(){
  console.log(x)
  var x = 2;
  console.log(x)
}
func()

x的声明被提升到function.So范围的顶部以上代码与

相同
function func(){
  var x; //x is declared and its value is undefined
  console.log(x)
  x = 2;
  console.log(x)
}
func()