■ 关于预解析
JS代码是由浏览器的JS解析器执行的
JS解析器是在运行javascript代码时分以下两步:
▶ 预解析: js引擎会把js里面所有的var 还有function提升到当前作用域的最前面
▶ 代码执行: 按照代码书写的顺序从上往下执行
■ 变量预解析
变量预解析,也叫变量提升
就是把所有的变量声明提升到当前的作用域最前面,只提升变量声明,不提升赋值操作
例1
//原代码
console.log(num); //输出:undefined
var num = 10;
//相当于执行以下提升后的代码
var num;
console.log(num);
num =10;
例2
//原代码
fun();
var fun = function(){
console.log(22); //报错
}
//相当于执行以下提升后的代码
var fun;
fun();
fun = function(){
console.log(22);
}
■ 函数预解析
函数预解析,也叫函数提升
把函数声明提升到当前作用域的最前面,不调用函数
例1
//原代码
fn(); //输出:22
function fn(){
console.log(22);
}
//相当于执行以下提升后的代码
function fn(){
console.log(22);
}
fn();
例2
//原代码
var fun = function(){
console.log(22); //报错
}
fun();
//相当于执行以下提升后的代码
var fun;
fun = function(){
console.log(22); //报错
}
fun(); //函数表达式,调用必须写在函数表达式的下面,不报错
例3
//原代码
var num = 10;
fun();
function fun(){
console.log(num);
var num = 20;
console.log(num);
}
//相当于执行以下提升后的代码
var num;
function fun(){
var num;
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fun(); //输出:undefined,20