Javascript高級編程學習筆記(7)—— 函數

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

今天的主要內容是JS中的函數數組

這一篇主要講函數的定義等內容,至於變量提高、執行環境、閉包、內存回收等內容在後面講,高玩們能夠不用看下面的正文了。閉包

 

函數

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

Js中的函數經過function關鍵字來聲明函數,函數用於封裝任意多條語句,可讓咱們用函數來來實現某一特定功能,避免編寫重複的代碼。函數

 

使用方法以下:spa

function 函數名(參數){
    // 要執行的代碼塊  
}

跟其餘語言中的函數相比JS中的函數存在如下特徵:調試

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

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

在其它編程語言中,好比C 聲明函數時須要顯式地聲明函數的返回值類型,void、int等。blog

若是不聲明返回值語言就會拋出錯誤,而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中沒有重載,定義同名函數只會重寫以前的函數(即會將以前的值覆蓋)

相關文章
相關標籤/搜索