瀏覽器解析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的賦值,可是輸出觸發在前面,故並不影響

相關文章
相關標籤/搜索