预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。
- 预解析 js引擎会把js 里面所有的var 还有function提升到当前作用域的最前面
- 代码执行,按照代码书写的顺序从上往下执行
预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
- 变量提升 就是把所有的变量声明提升到当前的作用域起那面 不提升赋值操作
console.log(num); //undefined
var num=10;
//相当于执行了以下代码
// var num;
// console.log(num);
// num=10;
fun();//报错
var fun=function(){
console.log(22);
}
//相当于执行了以下代码
// var fun;
// fun();
// var fun=function(){
// console.log(22);
// }
- 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
fun();//22
function fun(){
console.log(22);
}
预解析案例
1.结果是几?
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
undefined
2.结果是几?
var num=10;
function fn(){
console.log(num);
var num=20;
console.log(num);
}
fn();
undefined 20
3.结果是几?
var a=18;
f1();
function f1(){
var b=9;
console.log(a);
console.log(b);
var a='123';
}
undefined 9
4.结果是几?
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
由于b c没有用var声明,所以b c是全局变量
9 9 9 9 9 报错