首先,JavaScript的特点是:
1. 跨平台
可以再不同的操作系统上运行。
2. 弱类型
与之相对的是强类型
强类型:在定义变量的时候,需要将变量的数据类型表明。例如:Java
弱类型:定义变量的时候不需要定义数据类型,数据类型根据变量值来确定。例如:JavaScript
3. 解释执行,逐行执行
其次,JavaScript在浏览器中的执行过程分为三步:
1. 语法检测
主要看你的代码有没有基本的语法错误。例如:中文,关键字等等
2. 词法分析(预编译) ----- 重点介绍
3. 逐行执行
词法分析(预编译)
主要分为两种情况(全局,函数)
1. 全局(直接是script标签中的代码,不包括函数中的):
console.log(a); //返回值:function a(){}
var a = 100;
console.log(a) //返回值:100
var b = 200
var c = 300
function a(){ }
function fun(){ }
1. 在函数执行前,会生成一个GO(global object)对象,这是一个看不到的对象,但是我们可以模拟出来分析。
GO = {}
2. 分析变量声明,变量名为属性名,值为underfined
GO = {
a : undefined,
b : undefined,
c : undefined
}
3. 分析函数声明,函数名为属性名,值为整个函数体,如果函数名与变量名相同,那么变量名的值将被无情覆盖
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(){ }
}
2 . 局部、函数执行时
var num = 100;
function fun(num){
var a = 10;
console.log(num);
}
fun(5)
1. 预编译:先是全局
GO = {
num : undefined,
fun : function
}
GO = {
num : 100,
fun : function
}
2. 然后逐行执行,到fun(5),函数调用,回生成自己的作用域AO(active object),函数调用时,在执行前的一瞬间产生,如果有多个函数调用,就会产生多个AO,并且各不干扰,各不相同。
fun.AO = { }
3. 分析参数,形参作为属性名,实参作为值
fun.AO = {
num : 5
}
4. 分析变量声明,变量名为属性名,值为underfined,如果遇到AO对象上属性同名,不去做任何改变
fun.AO = {
num : 5,
a : underfined
}
5. 函数声明,函数名为属性名,值为整个函数体,如果遇到AO对象上属性同名,则无情覆盖(没有跳过)
6. 逐行执行,分析过(变量声明、函数声明)不用管,只管赋值(变量赋值)
fun.AO = {
num : 5,
a : underfined
}
最后的输出的为:5
两者在步骤上没有什么大的区别,只是函数多了形参与实参的那一步。