JavaScript1.5 函式(Functions)
在 JS 中,函式是主要的構築區塊之一。函式是 JS 的一個程序(一組執行特定任務的敘述語句)。通常函式是用來處理一些經常用到或者是其它 Script 所共用的程式碼;也就是說,它可以簡化一些程式碼經常性的工作。
這個程序區塊(函式)可以從函式的呼叫處,將呼叫處的參數(argument)或引數(parameter)傳入至函式中處理後,再將結果回傳(return)至函式的呼叫處。假如您要使用一個函式,則我們必須先定義這個函式,然後在您的腳本(Script)中才能呼叫與使用它。
- 定義函式(Defining Functions)
- 呼叫函式(Calling Functions)
- 使用參數物件(Using the arguments object)
- 內建的函式(Predefined Functions)
定義函式(Defining Functions)
一個函式的定義,除了所包含的 function 關鍵字外,在其之後仍須有以下的東西:
- 函式的名稱。
- 函式的參數(arguments)須在括號中,若有一個以上的參數,則需以 , (逗號)來隔開彼此。
- JS 的敘述(statements)須在我們所定義函式的大括號 {} 之中(函式的主體)。這些在函式中的敘述,可以包含在當前應用中,所呼叫其它函式的定義。
簡單的範例(Simple example)
例如,以下的程式碼定義了一個被稱為 square 的簡單函式:
function square(number) {
return number * number;
}
在這個 square 函式中,只有一個被命名為 number 的參數。該函式包含一列用來指示回傳函式乘以它本身參數的敘述。透過函式的 return 敘述,將會回傳在 return 之後表達式(運算式)的值。
return number * number
原始的引數(parameters)會透過值來傳遞給函式。值會被傳遞給函式,但是假如函式改變了引數之值的話,這個改變將不會反映在全域或呼叫函式上。
function myFun(myValue) {
return myValue - 1;
};
var myValue = 100;
document.write(myFun(myValue)); //結果為 99(經由函式處理後的回傳值)
document.write(myValue); //結果為 100
//雖然經由函式改變了 myValue 的值,但原始的 myValue 值卻沒有改變
//函式內所改變的值,不會影響到函式外的其它東西
假如您透過物件(例如一個非原始值,像是陣列或者使用者自定義的物件)來作為引數,則該物件的參考會傳遞到函式。這是表示,如果函式改變了物件的屬性,其變化(值)將可在函式外部所見,例如下面範例所顯示:
function myFunc(theObject) {
theObject.make = "Toyota";
}
var mycar = {make:"Honda", model:"Accord", year:1998}; //mycar 物件
var x = mycar.make; //回傳 Honda
myFunc(mycar); //以 mycar 物件作為引數來呼叫 myFunc 函式
var y = mycar.make; //回傳 Toyota (物件的屬性值被函式所改變)
注意,指派一個新物件給引數,在呼叫端(caller)將不會有任何影響:
function myFunc(theObject) {
theObject = {make:"Ford", model:"Focus", year:2006};
}
var mycar = {make:"Honda", model:"Accord", year:1998};
var x = mycar.make; // 回傳 Honda
myFunc(mycar);
var y = mycar.make; // 仍然回傳 Honda
有條件地定義函式(Defining functions conditionally)
函式可以依據條件來做定義。例如,底下的函式範例:
if (num == 0) {
function myFunc(theObject) {
theObject.make = "Toyota";
}
}
在上述範例中,只有當變數 num 等於 0 時,myFunc 函式才會被定義。如果變數 num 不等於 0 時,myFunc 函式並不會被建立,並且嘗試任何的執行該函式都將失敗。
函式表達式(Function expressions)
函式也可以被定義在表達式裡,這樣的式子稱之為函式表達式(Function Expressions)或者稱之為函式實字(Function Literal)或匿名函式(Anonymous Function)。通常這類的函式是匿名的,也就是說該函式並不一定要有一個名稱。例如以下的 square 函式範例;第一個是使用函式敘述的方式來建立,第二個則是使用函式實字的方式來建立:
function square(number) { return number * number }; //函式敘述(Statements)
var square = function(number) { return number * number };//函式實字(Literals)
當您將一個函式作為參數,然後將它傳遞到另一個函式,這樣的做法是合適的。在以下的範例中,顯示了 map 函式開始的定義並且之後呼叫使用一個匿名函式來作為它的第一個參數:
function map(f,a) {
var result = new Array;
for (var i = 0; i != a.length; i++)
result[i] = f(a[i]);
return result;
}
呼叫 map 函式
map(function(x) {return x * x * x}, [0, 1, 2, 5, 10]);
結果回傳 [0, 1, 8, 125, 1000]。
function 與 return
| function 與 return | 兼容性:IE3+、NN2+、Moz1+、Safari1+ |
function functionName([arg1,...[,argN]]) {
statements;
return retValue;
}
functionName:函式名稱。
arg:參數。
retValue:回傳值。
function 是用來定義一個函式的關鍵字,而 return 則是從函式中返回呼叫這個函式的地方。
如果函式之中沒有 return 的話,則函式會將函式中所有的敘述執行一次,然後回傳一個 undefined 值給呼叫函式的地方。
如果 return 後面有相關的表達式,則會回傳表達式的結果值,並且會立即中斷函式,無論之後有無其它的敘述;如果 return 後面沒有其它相關的表達式,則會回傳一個 undefined 值,並且會立即中斷函式,無論之後有無其它的敘述。
//範例一
function myFunc(number) {
return number*number;
}
myData = 9;
document.write(myFunc(myData)); //結果為81
//範例二
function myFunc1(a,b) {
function myFunc2(x) {
return x*x;
} return myFunc2(a) + myFunc2(b);
}
document.write(myFunc1(1,2)); //結果為 5
document.write(myFunc1(2,3)); //結果為 13
document.write(myFunc1(9,5)); //結果為 106
//範例三
function outside(a) {
function inside(b) {
return a + b;
} return inside;
}
document.write(outside(1)(2)); //結果為 3
document.write(outside(4)(3)); //結果為 7
呼叫函式(Calling Functions)
正常情況下,當我們定義好一個函式,假如沒有呼叫使用它,那是沒意義的,因為該函式就是空在那邊。所以當我們以簡單的名稱定義了一個函式並且指定當我們呼叫它時,它應該做什麼。呼叫(Calling),函式使用已表明的引數來實際地執行指定的動作。例如,假設您定義了一個 square 函式後,您就可以使用如下的方式來呼叫:
square(5)
上面的敘述,其解釋就是我們使用參數 5 來呼叫 square 函式。square() 的本身就是一個呼叫函式的動作,而 5 這個參數就是用來啟動函式內的動作。
function square(number) {
return number * number; //回傳 number * number 之值到呼叫這該函式的地方
}
document.write(square(5)); //結果為 25
函式的參數並不只有限於字串或數值,您也可以使用物件來作為函式的參數。
函式可以迴遞(recursive),也是是說,它可以呼叫它自己本身。例如以下是一個計算階乘的函式:
function factorial(n) {
if ((n == 0) || (n == 1))
return 1;
else {
var result = (n * factorial(n-1) );
return result;
}
}
以下顯示計算參數值 1 到 5 的 factorials 函式結果:
a = factorial(1); // 回傳 1 b = factorial(2); // 回傳 2 c = factorial(3); // 回傳 6 d = factorial(4); // 回傳 24 e = factorial(5); // 回傳 120