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

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

2. 预解析分为变量预解析(变量提升)和函数预解析(函数提升)

(1) 变量提升:就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
(2) 函数提升:就是把所有的函数声明提升到当前作用域的最前面 不调用函数

  1. // 1.问
  2. console.log(num); // undefined
  3. // 2.问
  4. console.log(num); // undefined
  5. var num = 10;
  6. // 相当于执行了以下代码
  7. // var num;
  8. // console.log(num);
  9. // num = 10;
  10. // 3.问
  11. fn();
  12. function fn() {
  13. console.log(11); // 11
  14. }
  15. // 4.问
  16. fun();
  17. var fun = function() {
  18. console.log(22);
  19. }
  20. // 相当于执行了以下代码
  21. var fun;
  22. fun();
  23. fun = function() {
  24. console.log(22);
  25. }

3. 预解析案例

案例1:结果是几?

  1. var num = 10;
  2. fun();
  3. function fun() {
  4. console.log(num); // undefined
  5. var num = 20;
  6. }
  7. // 相当于执行了以下代码
  8. var num;
  9. function fun() {
  10. var num;
  11. console.log(num); // undefined
  12. num = 20;
  13. }
  14. num = 10;
  15. fun();

案例2:结果是几?

  1. var num = 10;
  2. function fn() {
  3. console.log(num);
  4. var num = 20;
  5. console.log(num);
  6. }
  7. fn();
  8. // 相当于执行了以下代码
  9. var num;
  10. function fn() {
  11. var num;
  12. console.log(num); // undefined
  13. num = 20;
  14. console.log(num); // 20
  15. }
  16. num = 10;
  17. fn();

案例3:结果是几?

  1. var a = 18;
  2. f1();
  3. function f1() {
  4. var b = 9;
  5. console.log(a); // undefined
  6. console.log(b); // 9
  7. var a = '123';
  8. }
  9. // 相当于执行了以下代码
  10. var a;
  11. function f1() {
  12. var b;
  13. var a;
  14. b = 9;
  15. console.log(a); // undefined
  16. console.log(b); // 9
  17. a = '123';
  18. }
  19. a = 18;
  20. f1();

案例4:结果是几?

  1. f1();
  2. console.log(c);
  3. console.log(b);
  4. console.log(a);
  5. function f1() {
  6. var a = b = c = 9;
  7. console.log(a);
  8. console.log(b);
  9. console.log(c);
  10. }
  11. // 相当于执行了以下代码
  12. function f1() {
  13. var a;
  14. a = b = c = 9;
  15. // 相当于 var a = 9; b = 9; c = 9; b和c直接赋值 没有var声明 当全局变量看
  16. // 集体声明 var a = 9, b = 9, c = 9
  17. console.log(a); // 9
  18. console.log(b); // 9
  19. console.log(c); // 9
  20. }
  21. f1();
  22. console.log(c); // 9
  23. console.log(b); // 9
  24. console.log(a); // undefined