Maison >interface Web >js tutoriel >JavaScript IIFE : un guide complet des expressions de fonction immédiatement invoquées
JavaScript propose divers outils pour gérer efficacement la portée et l'exécution, et l'un des plus remarquables est l'Expression de fonction immédiatement invoquée (IIFE).
Un IIFE est une fonction qui est exécutée immédiatement après avoir été définie, fournissant une portée privée pour les variables et les fonctionnalités. Cette technique est couramment utilisée dans les scénarios où un code propre, modulaire et sans conflit est requis.
Une IIFE est une fonction JavaScript qui s'exécute dès qu'elle est définie. Voici à quoi cela ressemble :
(function () { console.log("This is an IIFE!"); })();
Ou, en utilisant les fonctions fléchées ES6, cela ressemble à ceci :
(() => { console.log("IIFE with an arrow function!"); })();
Le premier jeu de parenthèses () enveloppe la définition de la fonction, ce qui en fait une expression de fonction plutôt qu'une déclaration. Le deuxième jeu de parenthèses () appelle immédiatement la fonction.
Il existe plusieurs façons valables d'écrire des 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
Les IIFE offrent plusieurs avantages :
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
Dans cet exemple, la fonction calculateSum est privée et n'est pas accessible en dehors de l'IIFE.
Avant que let et const ne soient disponibles, les développeurs utilisaient les IIFE pour obtenir la portée des blocs.
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; }, }; })();
Bien que les IIFE soient toujours utiles dans certains scénarios, le JavaScript moderne propose plusieurs alternatives avec leurs propres avantages. Voici une comparaison :
Les IIFE sont toujours d'actualité pour :
(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
Bien que les fonctionnalités JavaScript modernes telles que les modules ES et la portée des blocs aient réduit le besoin d'IIFE dans certains scénarios, elles restent un modèle important dans le développement JavaScript. Comprendre les IIFE est crucial pour travailler avec les bases de code existantes, créer des bibliothèques compatibles avec les navigateurs et mettre en œuvre efficacement certains modèles de conception.
N'oubliez pas que le choix entre l'utilisation d'un IIFE et d'alternatives modernes doit être basé sur votre cas d'utilisation spécifique, les exigences de prise en charge du navigateur et les contraintes du projet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!