前幾天有事耽擱了,今天繼續更新編程
今天的主要內容是JS中的函數數組
這一篇主要講函數的定義等內容,至於變量提高、執行環境、閉包、內存回收等內容在後面講,高玩們能夠不用看下面的正文了。閉包
首先來說,函數對於任何編程語言都是一個十分核心的概念。編程語言
Js中的函數經過function關鍵字來聲明函數,函數用於封裝任意多條語句,可讓咱們用函數來來實現某一特定功能,避免編寫重複的代碼。函數
使用方法以下:spa
function 函數名(參數){ // 要執行的代碼塊 }
跟其餘語言中的函數相比JS中的函數存在如下特徵:調試
首先討論一下不用指定返回值這一點: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中沒有重載,定義同名函數只會重寫以前的函數(即會將以前的值覆蓋)