Un JavaScript IIFE impedisce le perdite allo spazio globale come chiusura? È questo il concetto corretto?

4

Vedo nel codice oa volte la gente ne parla, per qualche codice JavaScript:

(function() {
    var something;

    function someFunction() { 
        // some code here
    }

    // do something

}());

Questa è una "espressione di funzione immediatamente richiamata", o IIFE . Sento spesso che la gente dice "sì, fallo in una chiusura" o "fai questo in una chiusura" nel commento del codice - come se una chiusura "proteggesse la fuga dallo spazio globale".

Ma è questo il concetto corretto? Penso che sia un ambito locale, o un ambito locale anonimo, che scherma qualsiasi variabile locale dalla perdita all'ambito globale. Non ha davvero nulla a che fare con una chiusura, che è una funzione con una catena di portata. Certo, la funzione anonima utilizzata per l'IIFE è una chiusura, ma qui non è rilevante. Se si dice che si desidera una chiusura, è perché si desidera l'accesso all'ambito corrente (e tutti gli ambiti della catena di portata). Per dire, la schermatura della variabile locale nello scope globale "usando una chiusura" non è un concetto corretto, vero?

Aggiornamento: in qualsiasi lingua che non ha una chiusura, come C, puoi ancora fare esattamente la stessa cosa di schermare qualsiasi variabile locale per filtrare nello spazio globale. Quindi non è "chiusura" che sta facendo il lavoro.

    
posta 太極者無極而生 19.01.2016 - 01:00
fonte

1 risposta

2

I think it is a local scope, or an anonymous local scope, that is shield any local variables from leaking to the global scope.

Sì, è esattamente quello che è. E poiché JavaScript non ha effettivamente ambiti di blocco, l'unico modo per implementarlo è con le funzioni. Quindi, IIFE.

Dire che stai usando una chiusura qui è vero, perché l'espressione della funzione crea una chiusura. Senza di ciò, il tuo "ambito locale" non avrebbe accesso ad altre variabili nell'ambito in cui è stato trovato. Tuttavia, questo è ancora qualcosa di un dettaglio di implementazione - non è il nucleo del problema a livello di progettazione.

    
risposta data 19.01.2016 - 01:16
fonte

Leggi altre domande sui tag