JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript 解析器在运行JavaScript代码的时候分为两步:预解析和 代码执行 。
1.我们js引擎运行js分为两步: 预解析代码执行
1). 预解析js引擎会把js里面所有的var 还有function 提升到当前作用域的最前面
2).代码执行 按照代码书写的顺序从上往下执行
2.预解析分为变量预解析(变量提升) 和函数预解析(函数提升)
1)变量提升是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
2)函数提升是把所有的函数声明提升到当前的作用域最前面,不调用函数
案例:
console.log(num);//undefined
var num=10;
//相当于执行以下代码
var num;
console.log(num);
num=10;
显示:undefined
fun();//报错
var fun=function(){
console.log(22);
}
//相当于执行以下代码
var fun;//声明变量未给值,直接调用,导致报错,函数调用需写在函数表达式的后面才行
fun();
fun=function(){
console.log(22);
}
报错:fun is not a function
fu();//可以调用
fun=function(){
console.log(11);
}
//相当于执行以下代码
fun=function(){
console.log(11);
}
fu();
显示:11
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
//相当于执行以下代码
var num;
function fun(){
var num;
console.log(num);
num=20;
}
num=10
fun();
显示:undefined
var num=10;
function fun(){
console.log(num);
var num=20;
console.log(num);
}
fun();
//相当于执行以下代码
var num;
function fun(){
var num;
console.log(num);
num=20;
console.log(num);
}
num=10
fun();
显示:undefined 20
var a=10;
fun();
function fun(){
var b=9;
console.log(a);
console.log(b);
var a='123';
}
//相当于执行以下代码
var a;
function fun(){
var b;
var a;
b=9
console.log(a);
console.log(b);
a='123';
}
a=10
fun();
显示:undefined 9
fun();
console.log(c);
console.log(b);
console.log(a);
function fun(){
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
//相当于执行以下代码
function fun(){
var a=b=c=9;
//相当于Var a=9;b=9;c=9;b和c直接赋值,没有var声明,当全局变量看
console.log(a);
console.log(b);
console.log(c);
}
fun();
console.log(c);
console.log(b);
console.log(a);
显示:9 9 9 9 9 (a is not define)