函數運行的時候,有時須要提供外部數據,不一樣的外部數據會獲得不一樣的結果,這種外部數據就叫參數。
上式的 x 就是square函數的 參數。每次運行的時候,須要提供這個值,不然得不到結果。javascript
形式參數和實際參數是不一樣的變量,他們在內存中處於不一樣的位置,形式參數在函數運行結束時將被釋放。html
若是函數在調用時未提供實際參數,參數會默認設置爲: undefinedjava
若是y已經定義 , y || 返回 y, 由於 y 是 true, 不然返回 0, 由於 undefined 爲 false。web
(1)當調用函數時傳遞的實參比函數定義時的形參個數少,剩下的形參都將設置爲 undefined 值。segmentfault
(2)一般函數只保留靠前的參數,而省略靠後的參數。若是必定要省略靠前的參數,只有顯式傳入 undefined。數組
(1)若是函數調用時設置了過多的實際參數,剩下的實際參數沒有方法直接獲取,須要使用即將提到的arguments對象。函數
(1)因爲 JavaScript 容許函數有不定數目的參數,因此須要一種機制,能夠在函數體內部讀取全部參數。這就是arguments對象的由來。spa
(2)arguments對象包含了函數運行時的全部參數,arguments[0]就是第一個參數,arguments[1]就是第二個參數,以此類推。這個對象只有在函數體內部,纔可使用。3d
(1)指針
(2)
(1)經過arguments對象的length屬性,能夠判斷函數調用時傳遞的實際參數個數。
(2)注意
arguments對象的length屬性顯示實參的個數,函數的length屬性顯示形參的個數
(3)形參只是提供便利,但不是必需的
(1)須要注意的是,雖然arguments很像數組,但它是一個對象。數組專有的方法(好比slice和forEach),不能在arguments對象上直接使用。
(2)若是要讓arguments對象使用數組方法,真正的解決方法是將arguments轉爲真正的數組。
(3)下面是兩種經常使用的轉換方法:slice方法和逐一填入新數組。
(1)arguments對象有一個名爲callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。
(2)下面是經典的階乘函數
(3) 可是,上面這個函數的執行與函數名牢牢耦合在了一塊兒,可使用arguments.callee能夠消除函數解耦
(4) 但在嚴格模式下,訪問這個屬性會拋出TypeError錯誤
(5)這時,可使用具名的函數表達式
參考文章