關於JavaScript中函數的定義、對象以及對象實例化的理解

趁近段時間不是很忙,把之前有關JS學習的一些筆記整理了一下:

函數的定義:通俗點來講,函數是由事件驅動或者它被調用時執行的可重複使用的代碼塊。在JS中,函數的定義方式通常有以下幾種:

(1)function語句(函數聲明):

語法:function函數名(參數1,參數2…){函數體}

例:function test(a,b){
                  return(a+b);

}

 

(2)函數表達式,又稱函數字面量:

語法:var 變量名=function(參數1,參數2…){函數體}

例:var sum=function(sum1,sum2){

      return(sum1+sum2);

}

注:上式中由於function後面沒有函數名,這相當於將一個匿名函數賦予給了一個變量,所以也稱爲匿名函數。

var sum=function theSum(sum1,sum2){

    return(sum1+sum2);

}alert(theSum(1,2)); //3;

alert(sum(1,2)); //3;

我們可以看到兩者的值是一樣的,這說明我們可以通過函數名theSum來調用函數,也可以通過匿名函數來調用函數。

 

(3)使用Function構造函數:

語法:var 變量=new Function(”參數1”,”參數2”,…,”函數體”)

例:var add=new Function(“a”,”b”,”returna+b”);

 

幾種函數定義方式的比較與區別:

1.無論用哪種方法定義函數,它們都是Function對象的實例,並將繼承Function對象所有默認或者自定義的屬性和方法。

2.對於函數聲明和函數表達式這兩種函數定義方式而言,解析器並不是一視同仁的,解析器會優先解析函數聲明,並使其在執行任何代碼之前可用(可訪問);而對於函數表達式,只有當解析器執行到它所在的代碼行時。纔會被解釋和執行:

 例:alert(sum(1,2));// 3

     function sum(a,b){

       return a+b;

}

 例子運行的結果是3,這是爲什麼呢?這是因爲在代碼開始執行之前,解析器就已經通過函數提升的過程。而在代碼求值時,js引擎在第一遍會聲明函數並將其放到源代碼樹的頂部,即便聲明函數在調用函數的後面,所以如果換成等價的函數表達式,則會報錯:

 例:alert(sum(1,2));//sum is not a function

     var sum=function(a,b){

          return a+b;

}

3.對於Function構造函數,其實從表達形式上面看,它和函數表達式類似,但是一般用的比較少,原因在於:JS解析器在解析代碼時,並非一行行地進行解析和執行的,而是一段段地進行解析和執行,所以在同一段代碼裏面,解析器總會將函數聲明和函數表達式優先提取出來進行解析,只有當解析和執行完之後纔會按順序執行其他的代碼,而Function構造函數並非提前執行,而是動態執行,所以每次循環調用時,函數聲明和函數表達式被解析執行完之後就不會從頭再重新進行編譯,而Function每次循環調用時都需要動態編譯一次,效率很低。

 

對象:在JS中一切皆爲對象,它是一種無序數據的集合。可以從兩個層面去理解:

(1)對象是單個實物的抽象:一個人、一輛車可以是對象,一個網頁、一個服務器也可以是對象,當實物被抽象成對象的時候,實物之間的關係就變成了對象之間的關係,那麼我們就可以模擬現實的情況,對對象進行編程;

(2)對象就好比是一個容器,它裏面包含了屬性和方法,屬性指的對象的狀態,方法指的是對象的行爲,例如我們把動物抽象成對象,那麼屬性記錄動物的種類,而方法表示動物的某種行爲(奔跑、進食等),在JS中,方法就是對象裏面的一個函數。

 

對象實例化:要理解這個,我們首先要理解一個概念“類”,所謂類,指的是對象的模版。對象就是類的實例。由前面我們知道,對象是單個實物的抽象,所以通常需要一個模版,表示某一類實物的共同特徵,然後對象根據這個模版生成,這個過程就叫做對象實例化。但是在JS中是沒有“類”這個概念的,而是用構造函數來作爲對象模版的,所謂構造函數,指的就是專門生成對象的函數。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章