[JS] Function invocation

Prefix

有個需求,在執行函式前後各需執行一些固定的檢查與處理程序。例如:

  1. Lock Semaphore
    • Success lock: 繼續執行 step 2
    • Fail: 加入 waiting queue.
  2. 執行 特定函式
  3. Unlock Semaphore. 檢查 waiting queue.

為了處理上述狀況,想寫個 exec(args1, args2, ..., func) 函式,來簡化程式碼管理。 因而查了 JavaScript 函式的呼叫與參數傳達進一步資料,整理本篇。

Function Expressions

JavaScript 把 Function 視為 Object 的一種,對 Function 規範如下:

1
2
3
var myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
statements
};

name The function name. Can be omitted, in which case the function is anonymous. The name is only local to the function body. paramN The name of an argument to be passed to the function. statements The statements which comprise the body of the function.

依使用情境不同,宣告函式時 function 名字和參數名稱皆不是必須的參數。 而在宣告函式時未宣告的參數,可以在函式內透過 arguments 去取得內容,詳情在後面有範例。

Examples

Function expression without name

1
2
var x = function (a, b) {return a * b};
var z = x(4, 3);

Function expression without paramN name

1
2
var x = function (a, b) {return arguments[0] * arguments[1]};
var z = x(4, 3);

Named function expression

1
2
3
4
5
6
7
var math = {
'factorial': function factorial(n) {
if (n <= 1)
return 1;
return n * factorial(n - 1);
}
};

若在函式中想要呼叫自身函式,則必須為此函式命名。 這個函式名稱是個區域變數,作用範圍僅限該函式內可以參照。

The Arguments Object

JavaScript function 物件有個內建的物件叫做 arguments, 以陣列格式存放呼叫此 function 時所傳入的所有參數。

在 JavaScript 中,函數宣告時可以不指定參數的名稱,

Invoking a Function with a Function Method

Apply

Call

[% div surf %]

Reference