首先,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

两者在步骤上没有什么大的区别,只是函数多了形参与实参的那一步。