预编译

一、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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function fn(a) {
console.log(a); //f a() {}

var a = 123;

console.log(a); //123

function a() {}

console.log(a); //123

var b = function () {}

console.log(b); //f () {}

function d() {}
}
fn(1);
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
2
3
4
console.log(a);   //f a() {}
var a = 123;
function a() {}
console.log(a); //123
1.创建GO对象      
2. GO{
        a:undefined;
    }
4. GO{
        a:function () {}   
    }
   执行函数对a赋值
   GO{
        a:123
    }

例三(+)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function test(c) {
// var this = Object.create(test.prototype);
// var this = {
// __proto__ : test.prototype
// }
var a = 123;
function b() {}
}

AO{
arguments : [1];
this : window,
c : 1,
a : undefined,
b : function () {}
}