特色: 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的賦值,可是輸出觸發在前面,故並不影響。