2016-04-27 5 views
21

Vedo un sacco di questo vecchio JavaScriptScopo di passare vars globali per la funzione di auto-invocazione o "IIFE"

(function (w){ 

    w.bar = 'baz'; 

})(window); 

Qual è il vantaggio di cui sopra, oltre

(function(){ 

    window.bar = 'baz'; 

})(); 

stesso vale per qualsiasi global variable o variabile definita al di fuori dello IIFE.

+0

uguale a passare 'funzione f1 (f) {console.log (f)} f1 (1);' over 'funzione f1() {console.log (1)} f1(); 'Ti dà il vantaggio di definire il parametro in fase di esecuzione (che può essere definito in qualche altro posto). – gurvinder372

+11

[_Possibilità di posizionare oggetti globali nello scope locale fornisce velocità di ricerca interna più veloci e prestazioni_] (http://gregfranko.com/blog/i-love-my-iife/) – Rayon

+0

@Rayon questa dovrebbe essere la risposta e non un commento – smnbbrv

risposta

12
  1. Rende esplicito che si stanno utilizzando (e probabilmente modificando) i globali nella funzione.
  2. Consente di modificare il comportamento in futuro. Forse hai un mockWindow per un test unitario. Forse stai usando Node.js e non hai un window, ma vuoi aggiungere alla variabile globals.

p.s. IMO il guadagno di prestazioni banale menzionato da @ Rayon è un'aringa rossa.

0

Passando oggetti globali come finestra, documento, $ a IIFE (espressione funzione richiamata immediatamente) è possibile migliorare le prestazioni riducendo il tempo di ricerca dell'ambito. Ricorda che Javascript cerca prima la proprietà in ambito locale e il concatenamento fino allo scope globale. Pertanto, l'accesso all'oggetto della finestra nell'ambito locale riduce il tempo di ricerca.

2

La finestra di passaggio viene eseguita perché le variabili locali sono più facili e più veloci da accedere rispetto alle variabili globali ... questo potrebbe mostrare una leggera differenza nelle prestazioni. Il metodo è davvero utile con i modelli di modulo e/o l'iniezione di dipendenza.

Esempio

var moduleFirst = (function(){ 
    var name = "harry"; 
    return { 
     firstparam : name 
    } 
})(); 
var moduleTwo = (function(x){ 
    console.log(x.firstparam); 
})(moduleFirst) 

uscita sarà: harry

Così, quando la finestra viene passato in IIFE; tutti i suoi metodi rivelati sono disponibili in una variabile locale.

3

In pratica non c'è molta (nessuna?) Differenza con l'esempio che hai fornito, ma hai probabilmente semplificata dal codice che stai effettivamente osservando,.

In un programma più realistico, si avranno ambiti e richiami che vengono attivati ​​ed eseguiti nel eventloop in modo asincrono e si sta vincolando la variabile a un'istanza specifica in una chiusura, quindi;

(function (w){ 
    setTimeout(function(){w.bar = 'baz';},100); 
})(window); 
window = window2; 

Il bar è ancora stato impostato nella finestra originale, dal momento che questo è ciò che è destinato a w - dove nel

(function(){ 
    setTimeout(function(){window.bar = 'baz';},10); 
})(window); 
window = window2; 

Sarà impostato nell'istanza window2, dal momento che è come il la finestra è vincolata quando si verifica l'esecuzione del codice.

In questo esempio "finestra" è una variabile globale, ma lo stesso è il caso indipendentemente dall'ambito della variabile associata.

Problemi correlati