JavaScript变量声明的提升
JavaScript不管在浏览器中运行还是node.js平台运行,都会有一个预处理阶段。
在这个阶段js会分配全局作用域的变量的内存空间、开辟每个函数的堆内存、每个函数内部的局部变量的空间。
在预读阶段,有变量声明的提升,只提升声明,不提升赋值。
console.log(a);
var a = 10;
此时浏览器打印会是undefined,而不是报错,原因就是:预处理阶段有变量声明的提升,只提升声明,不提升赋值。
上面的代理在预处理阶段时应是:
var a;
console.log(a);
a = 10;
由此可见,预处理阶段把变量a提升到最上方,所以第二句打印的时候是变量声明未定义,所以是undefined。
最重要的是:一定要记住,变量声明的提升无视任何的if语句,是无条件的。
var a = true;
function fun(){
if(!a){
var a = 10;
}
console.log(a);
}
fun();
此时浏览器会输出10,原理:变量声明的提升无视任何的if语句。把上面的代码解析为:
var a = true;
function fun(){
var a
if(!a){
a = 10;
}
console.log(a);
}
fun();
由此可见,执行函数时,先声明变量未赋值,所以是undefined,undefined隐形转换是false,在if语句中,非false即为ture,走if条件语句,把10赋值给了a,然后下一步打印a即为10,这个案例可以说明:变量声明的提升无视任何的if语句。