Qual è il termine per una funzione JavaScript anonima che viene chiamata immediatamente?


29

Sto scrivendo una guida di stile JavaScript per il mio team, in modo che possiamo organizzare e contribuire più facilmente ai nostri documenti. Ma ho colpito un piccolo dosso che è dove si applica la mia domanda ...

Cosa dovrei chiamare una funzione JavaScript anonima che viene chiamata immediatamente. So che potrei semplicemente chiamarlo una "funzione anonima", ma vorrei sottolineare il fatto che viene chiamato immediatamente.

Ecco un esempio:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"

1
Nota che vedrai spesso questo costrutto (in modo inesatto) indicato come una "funzione di auto-chiamata"
AakashM

Risposte:


39

Hanno già un termine per questo nel mondo Javascript. Sono chiamati espressioni di funzione immediatamente invocate (IIFE) .

Cos'è

Alle funzioni IIFE non viene assegnato un nome. Invece, vengono eseguiti una volta mentre l'interprete li incontra:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

Le parentesi finali dopo la parentesi graffa di chiusura del blocco di codice indicano all'interprete di chiamare immediatamente l'espressione della funzione.

Se si scrive una dichiarazione di funzione è necessario aggiungere operatori di raggruppamento , o parentesi che circondano la funzione, per dire all'interprete di trattare la funzione come un'espressione che può essere immediatamente invocata:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Quando vengono utilizzati

Gli IIFE vengono utilizzati per il codice che deve essere eseguito una sola volta all'interno di un'attività, anziché essere ripetutamente chiamato.

  1. Come argomento quando viene chiamata una funzione (per calcolare valori, ecc.)
  2. Per assegnare il valore di una proprietà a un oggetto.
  3. Gestori e ascoltatori di eventi.
  4. Per evitare conflitti tra due script che potrebbero utilizzare gli stessi nomi di variabili. Possono essere usati come wrapper per rilasciare il codice in un altro script in cui non sei sicuro che i nomi delle variabili possano essere uguali.

One nitpick: Nel tuo esempio usando var area = ..., non hai bisogno delle parentesi "a capo" sulla funzione, perché è già un'espressione di funzione in virtù dell'essere sul lato destro della =. Le parentesi di avvolgimento sono necessarie solo quando la funzione è scritta come una dichiarazione di funzione (cioè senza il carattere iniziale var area = ...).
Eric King,

@EricKing l'ho fatto bene?
Lawrence Aiello,

Potrebbe essere bello poter chiamare più casualmente queste "funzioni espresse"
filtro

@LawrenceAiello Ho aggiunto una modifica per mostrare cosa intendevo dire. Spero che funzioni ancora per te.
Eric King,

Come domanda correlata, c'è qualche motivo per passare un argomento all'IIFE come mostra la domanda? Li ho visti solo come dimostrano, senza alcun argomento (poiché qualsiasi argomento può essere una variabile locale).
Kat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.