全局使用var声明的变量默认为window所有(在es5中)
全局未经声明的便赋值的变量,为window所有,(暗示全局变量 imply global)

函数声明函数整体提升
变量声明提升

全局预编译:发生在页面加载完成时执行
局部预编译:发生在函数执行的前一刻

Global Object

  1. 创建全局活动对象
  2. 查找变量声明,作为GO的属性名,值为undfined.
  3. 查找函数声明,函数名作为属性名,值为函数引用

    语法分析

    在执行之前会通篇扫描错误的语法,扫描期间不会执行;比如 b is e not fined

    预编译

    创建全局GO对象
    全局查找变量声明,和函数声明,赋值未GO对象
    Go 变量名为GO键,值为undefined,函数名为GO键,值为函数体

    逐行执行

    当前已存在GO对象,js代码逐行执行,遇到赋值语句把undefined替换为当前键的值

    Activation Object

    函数预编译四部曲

  4. 创建AO对象

  5. 查找形参和变量声明
  6. 实参形参相统一
  7. 查找函数中的函数声明,函数整体提升

    Activation object

    创建AO对象,既执行器上下文

    查找形参和变量声明

    寻找函数中的形参和变量声明,将变量和形参名作为AO对象的属性名,值为undefined

    实参形参相统一

    找到所有的形参,和传入的实参统一赋值

    寻找函数中的函数声明

    查找函数体中的函数声明,给AO对象的值赋值,值为函数体

函数提升优先,变量和函数名重复的时候,值为函数体。形参也挡不住

~~ 举个栗子

  1. function fn(a) {
  2. console.log(a);
  3. var a = 123;
  4. console.log(a);
  5. function a() { };
  6. console.log(a);
  7. var b = function () { };
  8. console.log(b);
  9. }
  10. //调用函数
  11. fn(1);
  12. // 1. 创建AO
  13. AO = {
  14. };
  15. // 2. 寻找形参和变量声明, 值为undefind
  16. AO = {
  17. a : undefined,
  18. b : undefined,
  19. }
  20. // 3. 实参和形参相统一
  21. AO = {
  22. a : 1,
  23. b:undefined
  24. }
  25. // 4. 寻找函数中的函数声明
  26. AO = {
  27. a : function () { },
  28. b : function () { }
  29. }
  30. // next, 逐行执行
  31. ƒ a() { }
  32. 123
  33. 123
  34. f () {}