1. 程式人生 > >Javascript高階程式設計學習筆記(7)—— 函式

Javascript高階程式設計學習筆記(7)—— 函式

前幾天有事耽擱了,今天繼續更新

今天的主要內容是JS中的函式

這一篇主要講函式的定義等內容,至於變數提升、執行環境、閉包、記憶體回收等內容在後面講,高玩們可以不用看下面的正文了。

 

函式

首先來講,函式對於任何程式語言都是一個十分核心的概念。

Js中的函式通過function關鍵字來宣告函式,函式用於封裝任意多條語句,可以讓我們用函式來來實現某一特定功能,避免編寫重複的程式碼。

 

使用方法如下:

function 函式名(引數){
    // 要執行的程式碼塊  
}

跟其他語言中的函式相比JS中的函式存在以下特徵:

  • 定義時不用指定返回值
  • 引數名非必須,可以是任意多個
  • 在嚴格模式下,不能將函式名和引數名命名為argumentseval

首先討論一下不用指定返回值這一點:

在其它程式語言中,比如C 宣告函式時需要顯式地宣告函式的返回值型別,void、int等。

如果不宣告返回值語言就會丟擲錯誤,而JS是一門解釋型的指令碼語言,所以很少在編譯時報錯。

許多錯誤都是執行時報錯,這給我們程式設計帶來便利的同時,也給我們程式碼的除錯帶來了不小的困難。

 

雖然JS不用宣告返回值型別,以及是否有返回值,但是和其他語言類似。

都是使用return關鍵字來返回值,有一點需要注意的是return後面的語句永遠不會執行,函式執行完return語句後會立即停止並退出。

如果return 不返回任何值,那麼js將返回 undefined

 

然後是引數名非必需,數量不一定

這是由於JS內部對於函式引數使用arguments陣列來儲存,這也是嚴格模式下不能使用arguments為引數名的原因。

然後將arguments中的值賦值給引數識別符號(引數名)

所以引數名在JS中是非必需的,提供引數名只是為了為我們在函式中使用該引數時提供便利。

正是由於上述特點,所以JS沒法為每一個函式建立一個獨有的函式簽名(一些強型別語言中,函式定義時的引數、返回值型別都會作為函式簽名的一部分,呼叫時必須符合函式簽名才能正常呼叫)

沒有函式簽名,那麼JS自然也就沒有過載這一說法了。

雖然沒有函式簽名但是我們仍可以使用arguments來實現一些並不完美的過載

比如:

PS. 關於arguments中的值,永遠與引數名的值保持一致,即修改引數名中對應的值arguments中的值一樣會改變。

但這並不意味著,arguments中的值和引數名中的值是同一記憶體空間,兩者只是值保持同步。

除此而外,arguments的長度不是由函式定義時的引數名決定的,而是執行時傳入的引數個數決定的,所以為沒有傳入的引數賦值不能通過arguments陣列賦值。

並且在嚴格模式下重寫arguments的值會報錯

 

PS. JS中的引數都是值傳遞,不能通過引用傳遞引數

PS. JS中沒有過載,定義同名函式只會重寫之前的函式(即會將之前的值覆蓋)