By Noxxxx from https://interview.noxxxx.com/?post_type=post&p=19 上山打老虎
欢迎分享与聚合,尊重版权,可以联系授权
Javascript 引擎在“预编译”阶段执行函数声明提升和变量声明提升,没有赋值行为,匿名函数不参与预编译 ;只有在解释执行阶段才会进行变量初始化。
- 函数声明整体提升—(无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
- 变量 声明提升—(无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined)
同名情况下,函数声明提升优先级要高于变量声明提升,且提升后该函数声明定义不会被提升后的同名变量声明所覆盖,但是会被后续顺序执行的同名变量赋值所覆盖。
函数声明提升,会将函数的声明和定义全都提升至作用域顶部。
变量声明提升,只提升声明部分(未赋值状态),赋值部分保持原位置不动。
console.log(a)
var a = 1
function a() {}
// 打印 ƒ a() {}