JavaScript 提供了各種有效處理作用域和執行的工具,其中最值得注意的工具之一是 立即呼叫函數表達式 (IIFE).
IIFE 是定義後立即執行的函數,為變數和功能提供私有範圍。這種技術通常用於需要乾淨、模組化、無衝突程式碼的場景。
IIFE 是一個 JavaScript 函數,一旦定義就會運作。它看起來像這樣:
(function () { console.log("This is an IIFE!"); })();
或者,使用 ES6 箭頭函數,它看起來像這樣:
(() => { console.log("IIFE with an arrow function!"); })();
第一組括號 () 包裹了函數定義,使其成為函數表達式而不是宣告。第二組括號 () 立即呼叫函數。
有幾種有效的方法來寫 IIFE:
// Using the unary operator !(function () { console.log("IIFE using !"); })(); // Using void void (function () { console.log("IIFE using void"); })(); // Using + operator +(function () { console.log("IIFE using +"); })(); // IIFE with parameters and return value const result = (function (x, y) { return x + y; })(10, 20); console.log(result); // 30
IIFE 具有多項優勢:
const utils = (function () { const calculateSum = (a, b) => a + b; const calculateProduct = (a, b) => a * b; // Only expose what we want to be public return { sum: calculateSum, // product remains private }; })(); console.log(utils.sum(3, 7)); // 10 console.log(utils.calculateProduct); // undefined
在此範例中,calculateSum 函數是私有的,無法在 IIFE 外部存取。
在 let 和 const 可用之前,開發人員使用 IIFE 來實現區塊作用域。
for (var i = 0; i < 3; i++) { (function (j) { setTimeout(() => console.log(j), 1000); // 0, 1, 2 })(i); }
const Config = (function () { let instance; function createInstance() { const settings = { theme: "dark", language: "en", }; return { getSettings: () => settings, updateSettings: (newSettings) => Object.assign(settings, newSettings), }; } return { getInstance: function () { if (!instance) { instance = createInstance(); } return instance; }, }; })(); const config1 = Config.getInstance(); const config2 = Config.getInstance(); console.log(config1 === config2); // true
const Calculator = (function () { // Private variables and methods let result = 0; function validate(num) { return typeof num === "number" && !isNaN(num); } // Public API return { add: function (num) { if (validate(num)) { result += num; } return this; }, subtract: function (num) { if (validate(num)) { result -= num; } return this; }, getResult: function () { return result; }, }; })();
雖然 IIFE 在某些場景中仍然有用,但現代 JavaScript 提供了多種具有各自優勢的替代方案。對比一下:
IIFE 仍與以下方面相關:
(function () { console.log("This is an IIFE!"); })();
(() => { console.log("IIFE with an arrow function!"); })();
// Using the unary operator !(function () { console.log("IIFE using !"); })(); // Using void void (function () { console.log("IIFE using void"); })(); // Using + operator +(function () { console.log("IIFE using +"); })(); // IIFE with parameters and return value const result = (function (x, y) { return x + y; })(10, 20); console.log(result); // 30
const utils = (function () { const calculateSum = (a, b) => a + b; const calculateProduct = (a, b) => a * b; // Only expose what we want to be public return { sum: calculateSum, // product remains private }; })(); console.log(utils.sum(3, 7)); // 10 console.log(utils.calculateProduct); // undefined
雖然 ES 模組和區塊作用域等現代 JavaScript 功能減少了某些場景中對 IIFE 的需求,但它們仍然是 JavaScript 開發中的重要模式。了解 IIFE 對於使用現有程式碼庫、建立瀏覽器相容的程式庫以及有效實現某些設計模式至關重要。
請記住,在使用 IIFE 和現代替代方案之間進行選擇應基於您的特定用例、瀏覽器支援要求和專案限制。
以上是JavaScript IIFE:立即呼叫函數表達式的完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!