JavaScript运行
js引擎运行js会分为两步:预解析和代码执行。
预解析:js引擎会把js里所有的var和function提升到当前作用域的最前面。
代码执行:按照代码书写的顺序从上往下执行。
预解析
预解析分为变量预解析(变量提升)和函数预解析(函数提升)。
1.所有的声明都会提升到作用域的最顶上去。
2.同一个变量只会声明一次,其他的会被忽略掉或者覆盖掉。
3.函数声明的优先级高于变量声明的优先级,并且函数声明和函数定义的部分一起被提升。
变量提升
将所有变量声明提升到当前作用域的最前面,不提升赋值操作。
案例1
fun(); //报错,函数不存在
var fun=function(){
console.log(1);
};
变量提升,相当于
var fun;
fun();
fun=function(){
console.log(1);
};
案例2
function a(){
console.log(c);
var c=2;
}
a(); //undefined 局部块中变量提升到局部块上方
相当于
function a(){
var c;
console.log(c);
c=2;
}
函数提升
把所有的函数声明(关键字声明)提升到当前作用域的最前面。
案例1
fn();
function fn(){
console.log(11);
};
函数提升,相当于
function fn(){
console.log(11);
}; //将函数声明提升到当前作用域最前面
fn();
案例2
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
相当于
var num;
function fun(){
var num;
console.log(num); //undefined
num=20;
}
num=10;
fun();
案例3
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a=b=c=9; //var a=9; b=9; c=9; 集体声明 ,b和c没有var声明。当做全局变量看
console.log(a);
console.log(b);
console.log(c);
}
相当于
function f1(){
var a; //变量提升
a=b=c=9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
} //函数提升
f1();
console.log(c); //9
console.log(b); //9 c和b为全局变量
console.log(a); //报错,在全局中未被定义