问题
首先:普遍认为函数声明提升优于变量提升
但为什么下面的结果是这样的呢(第一个输出我们好理解,因为是先编译后赋值,编译的时候先声明了var 和 function,之后再进行赋值)预编译看这篇
它们都会进行预解析,函数声明提前于变量声明,但是最终会被变量覆盖!
console.log(typeof a); // function
var a = 1;
function a(){}
console.log(typeof a); // number
解释:肯定是函数声明优先,但最后的结果要看谁最后赋值
函数声明先赋值,变量声明执行到赋值语句才赋值
因为两种声明方式共同操作一块栈空间,所以,主要看是谁最后赋值的,我们再看一个例子:
console.log(typeof a); // function
var a = 1;
function a(){}
console.log(typeof a); // number
这就看的出来了,通过上边的这个demo, 明显可以看出来,应该 函数声明先赋值的,它是在执行上下文的执行阶段一开始的时候就已经进行了赋值操作,所以 最开始 typeof a 可以得到 function;而,变量声明 是要执行到赋值语句的时候才进行的赋值,所以 最后 typeof a 得到是 number;