浏览器解析JavaScript原理(1)

特色: java

    一、跨平台    函数

    二、弱类型:JavaScript 定义的时候不须要定义数据类型,数据类型是根据变量值来肯定的spa

      强类型:定义变量的时候须要定义变量的类型:例如java,C#中的int a = 10   boolean a = true,直接肯定了数据类型    code

    三、解释执行,逐行执行对象

      JavaScript 执行过程    一、语法检测       看你有没有基本的语法错误,例如中文,关键字错误        blog

                二、词法分析(预编译)    ip

                三、逐行执行作用域

这里我着重讲一讲JavaScript的执行过程io

预编译的过程分为两种状况:console

1、全局(不包括函数执行)

  执行前:

    一、首先生成一个GO(global object)对象,看不到,可是能够模拟出来用来分析     GO = { }

    二、分析变量声明,变量名为属性名,值为undefined

    三、分析函数声明,函数名为属性名,值为函数体,若是函数名和变量名相同,则无情覆盖

      此时,GO就是预编译完成的最终对象,词法分析结束

    4.逐行执行,分析过(变量声明,函数声明)不用管了,只管赋值(变量赋值)

 

 

    下面先看一个例子:

            console.log(a);
            var a = 100;
            console.log(a)
            var b = 200
            var c = 300
            function a(){
                
            }
            function fun(){
                
            }            

      首先生成一个GO对象GO={ }

      而后分析变量声明:分别var了a.b.c三个变量,

      后面又声明了函数a()和函数fun(),因为函数a()函数名与变量a名字冲突,故将变量覆盖掉获得的最终对象为:

GO = {
                    a : function a(){
                
                    },
                    b : undefined,
                    c : undefined,
                    fun : function fun(){
                
                    }
                }

      而后进行逐行执行:

        首先输出的a为GO对象里的a:function a(){ };

        而后将100赋值给了a,GO对象里的a值变为100,故第二个输出的a为100;

 

2、函数执行

  当函数调用,也是会生成本身的做用域(AO:active object)AO活动对象。  函数调用时候,执行前的一瞬间产生的,若是有多个函数的调用,会产生多个AO

  一、函数执行前的一瞬间,生成AO活动对象

  二、分析参数,形参做为对象的属性名,实参做为对象的属性值

  三、分析变量声明,变量名为属性名,值为undefined,若是遇到AO对象上属性同名,不去作任何改变(注意这里的属性同名是不作任何改变的)

  四、分析函数声明,函数名为属性名,值为函数体,若是遇到AO对象上属性同名,则无情覆盖

  五、逐行执行

 

    下面再举一个简单的例子:

 

       var num = 100;
            
            function fun(num){
          var num = 50 console.log(num)
          num = 200 } fun(
5)

    一、预编译的时候
         GO = {
          num :undefined,
          fun :function
         }

    二、逐行执行  这时num被赋值变为100; 而后执行函数,参数为5

      首先生成函数本身的做用域AO,AO = { } 

      而后寻找函数中var定义的变量,有一个num,可是num变量名与参数名冲突,不作改变,num的值仍是为5

      而后逐行执行,先执行到赋值,num被赋值变为50,而后输出,因此输出的num值为50,虽而后面还有对num的赋值,可是输出触发在前面,故并不影响

相关文章
相关标签/搜索