js在声明一个变量时(var foo= 1)会分两步走。
第一步是var foo,(这一步是在为这个变量开辟一处内存空间并命名)
第二步是foo= 1,(这一步则是为开辟好并命了名的内存空间赋值)
但这两步并不是同时进行的,var foo这一步是在编译阶段进行,而foo= 1则是在执行阶段进行。简单来说,就是var foo这步是在浏览器一行行读js代码前执行的,而foo= 1则是留在你写的位置等待被执行的。所以如果代码里有不少变量,那么代码的一开始其实是这样的
var foo; var a; let b; const c;
接下来就是等浏览器到读js代码到foo= 1时,才会为foo这个变量附上值
而先为变量声明内存空间后赋值的这个行为就被称为变量提升
这就解释了为什么下面代码会打印undefined
console.log( a );//undefined var a = 2;
因为实际上代码是这样的
var a; console.log(a); a= 2;
这样已经声明了a却没有为a赋值,自然会输出undefined
只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。如果提升改变
了代码执行的顺序,会造成非常严重的破坏!
by the way, 是在var foo =1这句代码的定义域里提升,不会全部变量提升到最大的那个定义域