在JavaScript中,函數function就是物件。
JS中沒有方法重載
在JavaScript中,沒有方法(函數)重載的概念。
範例:
網頁中彈框顯示的是40。
說明雖然第二個方法是兩個參數,但是仍然呼叫了它。
交換兩個方法的順序之後,彈框顯示30,可以看出不管參數個數如何,是呼叫同名的後面的方法。
怎麼解釋這個現象?
這是因為函數宣告其實是建立了一個物件:
這樣add實際指向的是後面的對象,而方法調用的時候賦予的參數將會按順序賦給方法形式參數,後面沒有被賦值的參數就是undefined。
JavaScript的函數呼叫的時候沒有嚴格的參數個數檢查,實參個數小於形參個數是可以的,沒有被賦值的形參就是未定義值undefined。
實參個數大於形參個數也是可以的,這樣只有前面的實參會被使用,多出來的實參不會被使用。
Function物件
在JavaScript中有一個Function對象,所有自訂的函數都是Function物件類型的。
Function物件接收的所有參數都是字串類型的,其中最後一個參數就是要執行的函數體,而前面的參數則是函數真正需要接收的參數。
範例:
隱含物件arguments
在JavaScript中,每個函數都有一個隱含的物件arguments,表示給函數實際傳遞的參數。
arguments和函數的形式參數及其個數無關。
arguments有個有用的屬性length,表示實參的長度。可以藉助這個來模擬出函數的重載:
練習範例:
每個函數物件都有一個length屬性,表示該函數期望接收的參數格式。
它與函數的arguments不同,arguments.length表示函數實際接收的參數個數。
範例: