浏览器解析JavaScript原理

浏览器解析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
            }
                          

 

posted @ 2018-12-18 20:30  文艺小青年啊  阅读(385)  评论(0编辑  收藏  举报