转载自:https://www.cnblogs.com/Gary-Guoweihan/p/6251870.html
Js 变量声明提升和函数声明提升
Js代码分为两个阶段:编译阶段和执行阶段
Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容
包括变量声明(var a)和函数声明(function a(){})在内的所有声明都会在代码被执行前的编译阶段首先被处理
过程就好像变量声明和函数声明从他们代码中出现的位置被移动到执行环境的顶部,这个过程就叫做提升
只有声明操作会被提升,赋值和逻辑操作会被留在原地等待执行
变量声明
Js编译器会把变量声明看成两个部分分别是声明操作(var a)和赋值操作(a=2)
声明操作在编译阶段进行,声明操作会被提升到执行环境的顶部,值是undefined(表示未初始化)
赋值操作会被留在原地等待执行阶段
第一个案例:变量(fun)声明提前,等号后面的赋值留在原地,js执行时会从上向下执行。
第二个案例:函数声明(function fun(){ return 2; })提前,第二个函数会覆盖第一个函数,故而只会显示第二个函数的运行结果。