a = 2; var a; console.log(a);
很多开发者会以为输出的是undefined,因为var a声明在赋值之后,自然而然认为变量被重新赋值了,但真正的输出结果是2。
另外,这种情况输出会是什么呢
console.log(a); var a = 2;
介于第一个demo被坑过,很多开发者会认为输出是2,但真正的输出结果是undefined。
根据以上两个demo的演示,到底发生了什么?这其实可以引申为一个现有鸡还是先有蛋的问题,也就是到底是声明(蛋)在前,还是赋值(鸡)在前?
其实包括变量和函数在内的所有声明都会在任何代码执行前首先被处理,var a=2,其实可以分解成var a;和a=2;两个阶段来看:第一个定义声明实在编译阶段进行,第二个赋值会被留在原地等待执行。
这个过程就好像变量和函数的声明会从他们在代码中的位置“移动”到最上面,这个过程就叫做提升。
只有声明本身会被提升,而赋值和其它运行逻辑会留在原地。
那么根据这个思路我们再来剖析转换下两个demo就一目了然了:
demo1
var a; a = 2; console.log(a); //2
demo2
var a; console.log(a); //undefined a = 2;