关于函数提升例子不了解

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

上面代码中的打印结果是1,2
打印1可以理解,就是函数声明式可以提升,而函数表达式无法提升,所以调用的是第二个fn(),但是第二个打印我就无法理解了,问什么调用的是第一个定义的fn()呢。

因为var 定义的元素存在声明提升,所以代码翻译过来长这样

img


第一次你调用 fn 打印为2,是因为fn此时是个函数,你调用他直接就执行了,第二次调用的时候他已经将=后面的函数赋值给了fn,他会将你直接定义的fn替换掉,所以此时的fn就变成了你赋值之后的函数,你可以理解为你第一打印的时候还没有fn=function()这段

第二个 是因为 因为 已经执行function fn .再执行 的var fn 然后fn 被赋值成了 function(){ console.log(2) }


 fn();
   console.log(fn,"99")
   var fn = function () {
      console.log(2);
   }
   console.log(fn,"991")
   function fn() {
      console.log(1);
   }
   console.log(fn,"992")
   fn();

可以debugg一下 看看执行顺序

img

变量和函数声明都同时提升,函数的赋值也提升。
这个例子里,函数先被赋值函数2,再被赋值函数1。