2016-05-23 32 views
13

In ES5, la scrittura di tale codice è stato considerato come buona pratica:Abbiamo bisogno di avvolgere il codice ES6 in un IIFE?

(function() { 
    //some magic 
})(); 

Ma nelle variabili ES6 create con let parola chiave non sono attaccati al window oggetto.

Quindi, c'è bisogno ora di scrivere il nostro codice in un IIFE, o ha ancora degli scopi di cui non ho sentito parlare?

+0

Correlati: [Namespacing with IIFE in ES6?] (Http://stackoverflow.com/questions/32746615/namespacing-with-iife-in-es6) –

+1

Vedere anche [Will const e non rendere il pattern IIFE non necessario? ] (http://stackoverflow.com/q/33534485/1048572) – Bergi

+0

"* le variabili create con la parola chiave let" non sono associate a 'window' object *" - ma sono ancora globali. Quindi, se stai scrivendo degli script, dovrai metterli in un blocco o in un IIFE. – Bergi

risposta

5

Se si utilizzano i moduli, non è necessario utilizzare IIFE (è così che viene chiamato questo "wrapper"), poiché tutte le variabili hanno un ambito limitato al modulo.

Tuttavia, ci sono ancora alcuni casi in cui si desidera separare una parte del codice da un'altra, e quindi è possibile utilizzare IIFE.

Naturalmente se si sta utilizzando let o const, è possibile utilizzare un blocco di istruzioni, invece di IIFE:

{ 
    let something = 1; 
    const somethingElse = 2; 
} 
console.log(something); // ReferenceError: something is not defined 

vedere la domanda relativa a Programmers.SE: How far should encapsulation in JavaScript go?.

+0

A quanto ho capito, la classe ES6 offre essenzialmente la stessa, o quasi, funzionalità dell'IIFE. È corretto? – lux

+0

@lux No, le classi ES6 sono diverse. –

+0

'questo' è incapsulato nella classe, no? – lux

4

Ora è meno problematico, ma direi che c'è ancora un motivo per questa idea generale.

Teoricamente, è possibile per, diciamo, un po 'di libreria di terze parti di scrivere codice come questo seguente:

let count = 0; 
function getCount() { 
    return count++; 
} 

Ora, se si è tentato di creare il proprio variabile count nello stesso ambito, è' d un errore:

// 3rd-party 
 
let count = 0; 
 
function getCount() { 
 
    return count++; 
 
} 
 

 
// Your code 
 
let count = 1;

Tuttavia, è possibile rendere il codice più pulito utilizzando blo reale cks invece di IIFE.

// Still bad 3rd party 
 
let count = 0; 
 
function getCount() { 
 
    return count++; 
 
} 
 

 
// Your code 
 
{ 
 
    let count = 10; 
 
    console.log(count); 
 
    console.log(getCount()); 
 
    console.log(count); 
 
    console.log(getCount()); 
 
}

In futuro, si dovrebbe essere in grado di incapsulare il codice in moduli che avranno la loro portata e non avrà bisogno di avvolgere il vostro codice in un IIFE o di un blocco.

+0

In che modo lo scoping lessicale nelle classi ES6 influisce su questo? – lux

+0

@lux Come nell'ultimo esempio. Qualsiasi variabile dichiarata in un ambito diverso (inclusi i metodi in una classe) ombreggia le variabili in un ambito esterno senza tentare di ridefinire la variabile originale. Allo stesso modo, se provi a dichiarare una classe con il nome X in un ambito che ha già un'altra classe, o qualsiasi altra variabile, chiamata X, ti imbatterai in un errore di ridefinizione. –