JS 函数声明提升和变量声明提升

Javascript 引擎在“预编译”阶段执行函数声明提升和变量声明提升,没有赋值行为,匿名函数不参与预编译 ;只有在解释执行阶段才会进行变量初始化。

  1. 函数声明整体提升—(无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
  2. 变量 声明提升—(无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined)

同名情况下,函数声明提升优先级要高于变量声明提升,且提升后该函数声明定义不会被提升后的同名变量声明所覆盖,但是会被后续顺序执行的同名变量赋值所覆盖。

函数声明提升,会将函数的声明和定义全都提升至作用域顶部。
变量声明提升,只提升声明部分(未赋值状态),赋值部分保持原位置不动。

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

// 打印 ƒ a() {}