在 JavaScript 中,函數是第一類對象。每個函數都是 `Function` 構造函數的實例,擁有屬性和方法,可被賦值、傳遞、動態創建。
function add(a, b) { return a + b; }
// 引擎會隱式執行:var add = new Function('a', 'b', 'return a + b;');
var add = function(a, b) { return a + b; };
// 同樣是 Function 實例,但不會提升
var add = new Function('a', 'b', 'return a + b;');
// 每次調用都會解析字符串,性能差、安全風險大,極少使用
length:形參個數(不含剩餘參數)。name:函數名(匿名函數為空字符串或變量名)。prototype:原型對象,用於構造函數實例化時繼承方法。call(thisArg, ...args) / apply(thisArg, argsArray):顯式綁定 `this` 調用。bind(thisArg, ...args):返回綁定 `this` 的新函數(柯里化基礎)。toString():返回函數源碼字符串(含註釋、格式)。function calculate(a, b, operator) {
return operator(a, b); // operator 是函數對象
}
calculate(1, 2, (x, y) => x + y); // 3
calculate(1, 2, function(x, y) { return x * y; }); // 2
function counter() {
counter.count = (counter.count || 0) + 1;
return counter.count;
}
counter(); // 1
counter(); // 2
function multiply(a, b) { return a * b; }
var double = multiply.bind(null, 2);
double(5); // 10
| 誤區 | 真相 |
|---|---|
| 函數只是代碼塊 | 函數是可操作的對象,可傳遞、賦值、擴展屬性 |
| 箭頭函數也是 Function 實例 | 是,但無 `prototype`、無 `arguments`、不可作構造函數、this 詞法綁定 |
| Function 構造函數等同 eval | 同屬動態代碼執行,但 Function 創建的函數僅能訪問全局/自身作用域,無法訪問閉包變量,相對安全一點 |
「函數即對象」是 JavaScript 函數式編程、異步編程、框架設計的基石。掌握 `Function.prototype` 上的 `call/apply/bind`,理解閉包與 `this` 綁定機制,是進階 JS 開發者的必修課。