JavaScript解析器在运行JavaScript代码的时候分为两步:预解析 和 代码执行(按顺序从上到下)。
预解析:js引擎会把js里面所有的var
和function
提升到当前作用域的最前面。
- 预解析分为 变量预解析 和 函数预解析
变量预解析(变量提升):把所有变量声明提升到当前作用域的最前面,不提升赋值操作。
函数预解析(函数提升):把所有函数声明提升到当前作用域的最前面,不调用函数。
//函数提升,成功调用
fun();
function fun(){
console.log(num);
var num = 20;
}
- 函数表达式的调用必须写在函数表达式的下面。
匿名函数存在 变量提升 不存在函数声明提升
//这种赋值形式的函数无法提升,var fun在这是定义变量的意思 只能提升var fun;
fun();
var fun = function(){
console.log(22);
}
举例:
// 案例1
var num = 10;
fun();
function fun(){
console.log(num);
var num = 20;
}
// 相当于执行了以下操作,从外到里进行提升
var num;
function fun(){
var num;
//【局部变量和全局变量重名会覆盖全局变量】
console.log(num); //输出undefined,这是函数里面的num
num = 20;
}
num = 10;
fun();
// 案例2
var a = b = c = 9
// 相当于 var a = 9; b = 9; c = 9;所以这里 b和c直接赋值,没有var声明——当作全局变量看
// 不同于集体声明 var a = 9, b = 9, c = 9;