一段執行特定功能的指令集,可以寫成函式,並賦予名稱。如此只要一份程式碼,就可以在程序中多處使用。
function 指令 | Function 物件製造器 | function 計算器 | arguments | 自呼迴圈 | 多層巢的函式 |
- 函式可用指令 function 宣告,其基本語法是:
function 名稱( 參數1, 參數2, ..., 參數n) { 指令集; }
用指令宣告函式,可以在宣告前呼用,這與其它宣告法不同。函式的名稱與參數的名稱,要符合識別名的規定,不可用保留字。用指令宣告函式時,同時產生一個變數,與函式同名,內存函式的定義。
指令宣告法只能用在來源元件。來源元件是指最上層區塊中的指令,也包括指令 function 的第一層區塊。其它 if, for, switch 等指令的區塊,都不是最上層區塊,所以在其中不可用指令 function 宣告函式;要用 Function 物件製造器 或 function 計算器,產生函式。
- 有些版本的 javascript 支援有條件的宣告函式。下面的例子,不符合來源元件,但是 IE, Firefox, Chrome 都有支援。
- Safari 不支援上法;IE, Firefox, Chrome 都宣告成功。
- 函式可以宣告多個參數,最多可有 255 個參數。每次呼用函式時,可以給予不同的參數值。
基本型態的變數被設為參數,會將變數的值,傳給函式中的新變數;新變數被更改時,不會影響原來的變數。如果物件實體,陣列,文法規則計算式被設為參數,會將其記憶體位置傳給函式。函式會經由此記憶體位置,直接改變原物件,原陣列。
- 函式可以使用 return 回傳結果。
可用 Function 物件製造器 宣告函式。在 javascript 中,每個函式都是 Function 的物件實體。使用製造器宣告函式,不會繼承上層區間。使用製造器宣告的函式,每次呼用時,都要重新解讀其字串,建立函式;較它法多消耗處理器時間,建議少用。其語法是:
變數=new Function(參數1, 參數2, ..., 參數n, 指令集);
上面的參數與指令集,都放在字串中。數個參數可以放在一個字串,也可以分開放。可以省略 new。
可用 function 計算器,在計算式中宣告函式,存入變數中。其語法是:
變數=function [函式名稱](參數1, 參數2, ..., 參數n) 指令集;
函式名稱可以不宣告。如果此處宣告函式名稱,只能用在函式區內,在區外呼用函式名稱,會導致錯誤。可用變數名稱呼用函式。指令集有多個指令時,可用 { } 包夾。可用 function 計算器將多個函數存入陣列中。在物件中宣告方法,也要用到 function 計算器。使用 function 計算器宣告函式,會繼承上層區間。
- 上例中,有宣告函式名稱 bcc。IE 可以在區外呼叫 bcc();Firefox, Safari, Chrome 無法在區外呼用,還會導致錯誤。
可以用物件 arguments 取用參數,這可以用在參數個數變動的情形。物件 arguments 有三個特徵:
- arguments.callee:參數所在的函式。
- arguments.caller:呼叫此函式的前函式。此項已廢止,可以改用 函式名稱.caller。
- arguments.length:參數個數。
物件 arguments 不是陣列物件(Array),所以陣列物件的特徵與方法不能用在 arguments。arguments 只能在函式區內使用。
舊版的 javascript 是把 arguments 當作函式物件的特徵;取用 arguments 時,要加上函式名稱,例如 myFunc.arguments[0]。另有舊版中,函式的正式參數與區內變數,都是 arguments 的特徵,例如 arguments.var1。這些在新版 javascript 可能已拿掉。
- 上例中,使用 arguments.caller, arguments.ttl,新版的 javascript 會印出 undefined。IE 有支援 arguments.caller。Firefox, Safari, Chrome 都印出 undefined。
函式可以呼用自己形成迴圈(recursion)。自呼迴圈必須注意控制終點值。自呼迴圈最適合用在樹枝結構的搜尋。
在一個函式中,達成自呼迴圈,有三種呼用方法:函式自己的名稱,arguments.callee,存有函式的變數。
函式中可以宣告函式,可以有多層巢的函式宣告。函式內宣告的函式,只限區內使用。內層的函式可以使用外層函式的變數與參數;外層的函式不能使用內層函式的變數與參數。多層巢的函式佔用大量記憶體,建議少用。
呼用外層函式時可以直接設定內層函式的參數,例如 outer(外層參數)(內層參數),第二個括號 ( ) 設定內層函式的參數;此時要用 return 呼用內層函式,參見下例。