浏览器解析JavaScript原理特点:
1.跨平台
2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的
var a = 10; 数字类型
var a = true boolean类型
强类型: 定义变量的时候需要定义变量的类型:例如java,C#中的int a = 10 boolean a = true,直接确定了数据类型
3.解释执行,逐行执行
javascript 执行过程
1.语法检测 看你有没有基本的语法错误,例如中文,关键字错误...
2.词法分析(预编译)
3.逐行执行
预编译的过程(两种情况)
1.全局 直接是script标签中的代码,不包括函数执行
执行前:
- 1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析
- 2.分析变量声明,变量名为属性名,值为undefined
- 3.分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖
- 4.逐行执行,分析过(变量声明,函数声明)不用管了,只管赋值(变量赋值)
先来看一个例子
1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析
GO = {
}
2.分析变量声明,变量名为属性名,值为undefined
GO = {
a : undefined,
b : undefined,
c : undefined
}
3.分析<b>函数声明</b>,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖
GO = {
a : function a(){
},
b : undefined,
c : undefined,
fun : function fun(){
}
}
此时,GO就是预编译完成的最终对象,词法分析结束
4.逐行执行,分析过(变量声明,函数声明)不用管了,只管赋值(变量赋值)
a赋了一次值,值改变为100
GO = {
a : 100,
b : undefined,
c : undefined,
fun : function fun(){
}
}
二、函数执行
当函数调用,也是会生成自己的作用域(AO:active object)AO活动对象。 函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO
- 1、函数执行前的一瞬间,生成AO活动对象
- 2、分析参数,形参作为对象的属性名,实参作为对象的属性值
- 3、分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变(注意这里的属性同名是不做任何改变的)
- 4、分析函数声明,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖
- 5、逐行执行
例子
1.生成GO
GO = {
fun : function
}
2.逐行执行
3.函数的调用,就会生成fun.AO
fun.AO = {
}
4.分析参数
fun.AO = {
num : 10
}
5.分析var
fun.AO = {
num : 10
}
6.分析函数声明 没有,略
fun.AO = {
num : 10
}
7.逐行执行 第11行的时候,发生了赋值
fun.AO = {
num : 5
}