预解析:js解析器加载时,会首先检查语法错误,后进行变量声明提升和函数体声明提升,解释一行语句执行一行语句
1.检查语法错误
2.变量声明提升和函数体整体提升(变量提升时只提升变量名)
函数体中也有变量声明提升和函数体声明提升
console.log(a); //打印为undefined,var a;声明提升
var a = 100;
console.log(a); //打印为100
fn();
function fn(){
console.log(b); //打印为undefined
var b = 20;
console.log(b); //打印为20}console.log(c); //打印为undefined
var c = 100;
console.log(c); //打印为100
function fn(){
console.log(c); //打印为100
}
fn();

console.log(c); //打印为undefined
var c = 100;
console.log(c); //打印为100
function fn(){
console.log(c); //打印为undefined;自己函数体类的变量声明提升
var c = 20;
console.log(c); //打印为20,自己函数体内有变量c,就近原则,使用自己函数体内的变量
}
fn();

console.log(d); //打印为undefined
var d = 100;
console.log(d); //打印为100
function fn(){
console.log(d); //打印为100
d = 20; //定义的为隐式全局变量
console.log(d); //打印为20
}
fn();
console.log(a); //打印为undefined
var a = 100;
console.log(a); //打印为100
function fn(){
console.log(a);
a = 20; //定义的为隐式全局变量
console.log(a);
}
console.log(a); //打印为100
fn(); //在执行该语句时打印首先打印的是100(隐式变量声明未提升,首先该语句执行时之前没有找变量就从全局找)和
//20(从自己的中找到个隐式全局变量d,所以打印为20)
console.log(a) //打印为20(函数数体中的隐式全局变量覆盖了外部的变量)

console.log(a); //打印为undefined
var a = 100;
console.log(a); //打印为100
fn(); //在执行该语句时打印首先打印的是100(隐式变量声明未提升,首先该语句执行时之前没有找变量就从全局找)和
//20(从自己的中找到个隐式全局变量d,所以打印为20)
console.log(a); // 打印20,被100值被覆盖function fn(){console.log(a); a = 20; //定义的为隐式全局变量console.log(a); }console.log(a); //打印为20重要的是知道原理,不论在怎么变都能够明白