一、js运行三部曲
1. 语法分析   2. 预编译   3. 解释执行
二、预编译前奏
暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。
如 a = 10 , 则 window.a = 10;
如function test() {var a  = b = 123;}
test();
先将123赋给b,然后声明a,然后将b赋给a;
console.log(b)   -->   123;
console.log(a)   -->   undefined
三、预编译
预编译发生在函数执行的前一刻
局部(AO)
1.创建AO对象  (Activation Object)(执行期上下文)
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
全局(GO)            window === GO
1.生成了一个GO对象  Global Object
2.找变量声明,将变量作为GO属性名,值为undefined
4.在函数体里面找函数声明,值赋予函数体
例一:(局部)
1  | function fn(a) {  | 
1.创建AO对象
2.  AO{
        a: undefined,
        b: undefined,
    }
3.  AO{
           a: 1,
        b: undefined,
     }
4.  AO{
        a: function a() {},
        b: undefined,
        d: function d() {}
     }
 执行函数对a赋值
   AO{
        a: 123,
        b: undefined,
        d: function d() {}
    }
 执行函数对b赋值
   AO{
        a: 123,
        b: function () {},
        d: function d() {}
    }
例二:(全局)
1  | console.log(a); //f a() {}  | 
1.创建GO对象      
2. GO{
        a:undefined;
    }
4. GO{
        a:function () {}   
    }
   执行函数对a赋值
   GO{
        a:123
    }
例三(+)
1  | function test(c) {  |