文章目錄
學過編程的肯定都知道函數,通過函數可以封裝任意多條語句,而且可以在任何地方、任何時候調用執行,JavaScript中的函數也是如此,不過它與其他程式設計語言中的函數還是有諸多區別的
- 無須指定函數的傳回值,因為JavaScript 函數可以在任何時候返回任何值。
- 實際上,未指定傳回值的函數返回的是一個特殊的undefinded 值。
- 可以向JavaScript 函數傳遞任意數量的參數,因為其函數參數是以一個包含零或多個值的數組的形式傳遞的,並且可以通過arguments 對象來訪問這些參數。
- JavaScript 函數不能重載。
JavaScript 函數實際上是Function 類型的執行個體, 因此函數也是對象,而這一點正是JavaScript最有特色的地方,由於函數是對象,所以函數也擁有方法,可以用來增強其行為。
函數定義
JavaScript 函數使用function 關鍵字來聲明,後跟一組參數及函數體:
function functionName(arg0, arg1, ... , argN){ statements}
JavaScript 函數在定義時不必指定是否傳回值,實際上,任何函數在任何時候都可以通過return 語句後跟要返回的值來實現傳回值,如
function sum(num1, num2){ return num1 + num2;}var result = sum(6, 8);
函數會在執行完return 語句之後停止並立即退出,因此,位於return 語句之後的任何代碼都永遠不會執行
function sum(num1, num2){ return num1 + num2; alert("Hello world!"); // 永遠不會執行}
一個函數中也可以包含多個return 語句
function diff(num1, num2){ if(num1 < num2){ return num2 - num1; }else{ return num1 - num2; }}
別外,return 語句也可以不帶有任何傳回值,在這種情況下,函數在停止執行後將返回undefinded 值。這種用法一般用在需要提前停止函數而又不需要傳回值的情況下
function sayHi(name, message){ return; alert("Hi " + name + "," + message); //永遠不會執行}
函數參數
JavaScript 函數的參數與大多數其他語言中的參數有所不同,JavaScript 函數的參數不介意傳遞進來多少個參數,也不在乎傳進來的參數是什麼類型,即使你在定義函數的時候只接收兩個參數,但在調用這個函數的時候也未必一定要傳遞兩個參數,可以傳一個、三個、甚至不傳,之所以會這樣,是因為JavaScript 的參數在內部是用一個數組表示的,函數接收到的始終都是這個數組,而不關心數組中包含哪些參數。實際上, 在函數體內可以通過arguments 對象來訪問這個參數數組,從而擷取傳遞給函數的每一個參數。
對過arguments 對象可以使用方括弧文法訪問它的每一個元素,即第一個元素是arguments[0], 第二個元素是arguments[1],以此類推,使用length 屬性可以獲得傳遞進來參數的個數。
例如可以利用這一點讓函數可以接收任意個參數並分別實現適當的功能
function doAdd(){ if(arguments.length == 1){ return arguments[0] + 10; }else if(arguments.length == 2){ return arguments[0] + arguments[1]; }}doAdd(10); //20doAdd(10, 20); //30
沒有重載
JavaScript 函數不能像傳統意義上那樣實現重載,而在其他語言如JAVA中,可以為一個函數編寫兩個定義,只要這兩個定義的參數和數量不同即可,但JavaScript 函數的參數是由包含零個或多個值的數組來表示的,所以是無法實現重載的。
如果在JavaScript 中定義兩個名字相同的函數,則該名字只屬於後定義的函數,因為後定義的函數覆蓋了先定義的函數。
function addNum(num){ return num + 100;}function addNum(num){ return num + 200;}var result = addNum(100); //300
通過檢查傳入函數中參數的類型和數量並作出不同的反應,可以模仿方法的重載。