语法分析:js引擎在解析js代码之前,会通篇扫描一下,找出低级的语法错误(写错大括号之类的)。
编译执行:js是一种解释性语言,编译一行执行一行,当语法分析没有问题,并且已经完成预编译之后,便开始解释执行代码。
Js知识点小结(预编译)
js运行三部曲
- 语法分析
- 预编译
- 解释执行
预编译前奏
1.imply global 暗示全局变量。
如果任何变量未经声明就赋值使用,此变量就会为全局对象window所有,并且成为window对象的一个属性。
1. window.a = 123;
2. window.a === a // true;
或者
1. a = 123;
2. window.a === a //true
2.一切声明的全局变量,都是window的属性。
1. var a =123;
2. console.log(window.a); //123
- 区别:经过声明的全局变量不能通过delete操作来删除,但是未经声明的全局变量可以被删除。
1. a = 123;
2. console.log(wondow.a === a) //true
3. delete window.a;
4. console.log(window.a); //undefiend
5. var b = 123;
6. delete window.b;
7. console.log(window.b); //123
预编译的过程总结为以下四步:
1.创建AO对象。
2.寻找形参和变量声明,将变量和形参作为AO对象的属性名添加到对象中,值为undefined。值得注意的是,函数声明不叫变量。
3.将实参值和形参值相统一。
4.在函数体里面寻找函数声明,将函数名作为属性名,值为这个函数的函数体。 函数在执行的前一刻会产生一个上下文,这个上下文就是Activeaction Object对象,简称AO对象。 AO = {}
这个对象是空的,但是里面有一些我们看不到的却存在的隐式属性,比如this:window属性和arguments:[]属性
这个对象用来存放一些属性和方法,这些属性和方法就按照前面的四步来产生。
1. function test (a,b){
2. consolel.log a
3. function a(){}
4. a = 222;
5. console.log a
6. function b(){};
7. console.log b
8. var b = 111;
9. var a;
10. }
11. test(1)
这里用上面这个样例代码来简单的介绍一下预编译过程。
1.创建一个AO对象。
var AO = {} ;
2.寻找形参值和变量声明,并且将其赋值为undefined。
AO = {
a : undefined,
b : undefined
}
3.将实参值和形参值相统一。这里属性名已存在,直接赋值。
AO = {
a : 1,
b : undefined
}
4.寻找函数声明,将函数体赋值给属性。
AO = {
a : function (){},
b : function (){}
}
第一个console.log a –> function () {}
第二个console.log a –> 222 因为执行了a = 222这一行代码,所以重新赋值了。
第三个console.log b –> function () {}
• var b = function () {}这种不叫做函数声明,这个函数是赋值给b变量的,b变量是声明。
function fn(a){
a //function
d //function
var a = 123;
a //123
function a(){}
b //undefined
var b = function (){}
b //function
function d(){}
}
这里的var b = function () {}只是声明了b变量,在第四步寻找函数声明里面并不会把b赋值成function () {},因为后面的函数并不是声明,当代码开始解释执行之后,执行到这一行之后才把b赋值成这个函数。
• 寻找变量声明的时候,不会管里面的代码到底会不会执行,执行是后面的事,这里只负责寻找所有变量。
function test(b){
a //undefined
if(1>5){
var a = 123;
function b(){}
}
a //undefined
b //undefined
var b = 234;
b //234
}
test(2);
打印第一个a的时候并不会报错而是undefined,当a没有声明的时候才会报错,因此这里a是有声明的,只是没有赋值而已,它根本不看有没有if,if的条件是不是真对寻找变量声明都没有关系。
第二步寻找形参和变量声明时候的AO对象:
AO = {
a: undefined //这里a虽然在if里面 但是也被声明了
b: undefined
}