一.预解析概念
JS引擎在运行JS时通常分为两步,首先是预解析,然后执行代码
预解析分为**变量预解析和函数预解析。引擎会把JS里面所有的var和function**提升到当前作用域的最前面。
A 变量预解析:即变量提升,所谓变量提升就是把所有的变量声明提升到当前作用域的最前面。它只提升变量声明,不提升赋值。
例如 :var num = 10; 就相当于
var num;
num =10;
B 函数预解析:即函数提升,所谓函数提升就是把所有函数声明提升到当前作用域的最前面,但不调用函数。
fn();
function fn(){
console.log(123);
};
//虽然调用方法写在了函数之前,但是根据函数预解析规则,函数会被提升到作用域最前面。
//所以这段代码是可以正常输出结果的。
二.预解析案例
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 fn(){
console.log(num);
var num = 20;
console.log(num);
}
fn();
// 预解析分析
var num;
function fn(){
var num;
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fn();
// 输出结果为undefined和20
var a = 18;
f1();
function f1(){
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
// 预解析分析
var a;
function f1(){
var b;
var a;
b = 9;
console.log(a);
console.log(b);
a = '123';
};
a = 18;
f1();
// 输出结果为undefined和9
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);
}
// 预解析分析
function f1(){
var a;
a = b = c =9; //相当于var = 9; b = 9; c = 9; b和c直接赋值,是全局变量
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);//报错
// 输出结果为9,9,9,9,9和报错