# JavaScript 预解析

  1. 我们 js 引擎运行 js 分为两步: 预解析 代码执行

    1. 预解析 js 引擎会把 js 里面所有的 var 还有 function 提升到当前作用域的最前面
    2. 代码执行 按照代码书写的顺序从上往下执行
  2. 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)

    1. 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
    2. 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
console.log(num); // undefined  坑 1
var num = 10;
// 相当于执行了以下代码
// var num;
// console.log(num);
// num = 10;



// 3问
function fn() {
console.log(11);
}
fn();




// 4问
fun(); // 报错 坑2
var fun = function() {
console.log(22);

}
// 函数表达式 调用必须写在函数表达式的下面
// 相当于执行了以下代码
// var fun;
// fun();
// fun = function() {
// console.log(22);

// }

# 重点

1
2
3
4
5
6
7
8
9
10
11
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);
}

注意其中的 var a = b = c = 9; 相当于 var a = 9; b = 9; c = 9; b 和 c 直接赋值,没有 var 声明,当作全局变量看

所以最后输出结果为 : 9 9 9 9 9 undefined