- 我们js引擎运行js分为两步:预解析代码执行
(1).预解析js引擎会把js里面所有的 var 还有 function 提升到当前作用域的最前面
(2).代码执行按照代码书写的顺序从上往下执行 - 预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升就是把所有的变量声明提升到当前的作用域最前面不提升赋值操作
(2)函数提升就是把所有的函数声明提升到当前作用域的最前面不调用函教
案例1:
var num = 10;
function fn(){
console.log(num); //undefined
var num = 20;
console.log(num); //20
}
fn()
// 相当于以下代码
var num;
function fn(){
var num;
console.log(num); //undefined
num = 20;
console.log(num); //20
}
num = 10;
fn()
案例2:
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
// 以上代码相当于 var a = 9; b = 9; c = 9; b和c直接赋值,没有var声明,也就是全局变量
// 注意与 集体声明的区别 var a = 9, b = 9, c = 9;
console.log(a);
console.log(b);
console.log(c);
}
// 相当于以下代码
function f1() {
var a;
a = b = c = 9;
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
f1()
console.log(c); // 9
console.log(b); // 9
console.log(a); //a is not defined