2012-05-09 17 views
29

Continuo a vedere gli avvertimenti di non utilizzare le variabili globali in JavaScript, ma sembra che l'unica ragione per cui la gente dice sia perché blocca lo spazio dei nomi globale. Posso immaginare che possa essere risolto facilmente inserendo tutte le variabili in un unico grande oggetto. Ora la domanda è: ci sono altri motivi per non usare variabili globali diverse dal sake? Ci sono problemi di prestazioni o di compatibilità con loro?Perché le variabili globali sono considerate cattive pratiche?

+2

possibile duplicato di [Perché i globali sono nocivi?] (Http://stackoverflow.com/questions/4246284/why-are-globals-bad) e [altre domande] (http://stackoverflow.com/search? q = javascript + il motivo per cui sono + + + + variabili globali male). –

+2

JavaScript o altre lingue, importa meno. Ecco la [risposta canonica al perché i globals sono cattivi] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –

risposta

36

Essi ingombrano lo spazio dei nomi globale e sono più lenti a cercare rispetto alle variabili locali.

Prima di tutto, avere molte variabili globali è sempre una brutta cosa perché è facile dimenticare di aver dichiarato una variabile da qualche parte e di riscriverla accidentalmente da qualche altra parte. Se la tua prima variabile era locale allora non hai un problema. Se era globale, è stato appena sovrascritto. Ciò diventa ancora peggiore quando entri in un livello implicito (ad es. Quando dici someVar = someValue senza dichiarare alcunVar con la parola chiave var).

In secondo luogo, le variabili globali richiedono più tempo per "trovare" le variabili locali. La differenza di velocità non è enorme, ma esiste .

Per ulteriori informazioni e una spiegazione più approfondita del motivo per cui i globals sono considerati cattive pratiche, si consiglia di controllare this page.

0

Fondamentalmente, poiché è possibile accedervi da qualsiasi script sulla pagina e poiché è possibile ripetere il nome nello stesso ambito. Ecco perché un sacco di motori JavaScript utilizzare questo codice:

(function(){ 
    var foo = 'foo',//Local 
    bar = 'bar';//Local 
    window.globalVar = foo + bar;//Global 
})(); 
alert(foo);//Error 
alert(bar);//Error 
alert(globalVar);//'foobar' 
5

Se lo script è molto lungo e si utilizza queste variabili da un sacco di funzioni che aumenterà il tempo di debug in quanto il valore della variabile globale potrebbe essere stato cambiato da qualsiasi parte, quindi se stai monitorando dove questo è cambiato in un valore non previsto dovrai controllarli tutti.

Questo scenario è ancora più difficile se diversi programmatori modificano questa variabile da altri script inclusi nella pagina.

+2

Il debugging più complesso è solo uno dei motivi per cui i globals sono negativi. Altri sono elencati in [Perché i globali sono così cattivi] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –

2

Non ci dovrebbe essere alcun problema utilizzando le variabili globali nel codice finché li state avvolgendo all'interno di un uniqe namespase/oggetto (per evitare la collisione con gli script che non sono tuoi)

C'è uno adventage di usando la variabile globale in javascript, e deriva dal fatto che javascript non è un linguaggio di tipo forte. lì per, se si passa oggetti Somes complessi come argomenti a una funzione, voi probebly perdere tutto l'Intellisence per quegli oggetti (all'interno della portata delle funzioni.) durante l'utilizzo di oggetti insteads globali, conserverà che Intellisence. e quando si ha l'intelisence, in realtà può migliorare il tempo di debug (al contrario di quello che altri hanno detto ...)

personalmente lo trovo molto utile e sicuramente ha posto nel mio codice.

(ovviamente, si dovrebbe ALWAYSE rendere il giusto equilibrio tra i locali e le variabili globals)

9

Le variabili globali possono aumentare significativamente l'accoppiamento, riduce in modo significativo la scalabilità e la verificabilità del codice. Una volta di iniziare a usare globali, che hai ora di sapere dove e come la variabile viene modificato (cioè la rottura incapsulamento). La maggior parte della letteratura e convenzioni là fuori sostengono che le prestazioni è l'ultima delle vostre preoccupazioni quando si utilizzano variabili globali.

questo è un fantastic article outlining why variabili globali provocano mal di testa.

+3

Questa è la migliore risposta. –

2

In breve, le variabili globali causano (e più) i seguenti problemi.

1) Collisioni di nomi variabili: se si sta lavorando su un team e sia te sia il tuo collega di lavoro utilizzano lo stesso nome di variabile nello scope globale, la variabile definita last sovrascriverà la variabile iniziale. Questo ovvio può avere conseguenze devastanti.

2) Sicurezza: in particolare sul Web, ogni utente ha accesso all'oggetto Window (o globale). Inserendo le variabili nello scope globale, si dà a qualsiasi utente la possibilità di vedere o modificare le variabili.

3) Più lento - Questo è probabilmente trascurabile, ma esiste ancora. Il modo in cui le ricerche variabili di JavaScript funzionano è che il motore JavaScript eseguirà una ricerca sull'ambito corrente in cui la variabile viene cercata. Se non riesce a trovarlo, farà una ricerca nel prossimo ambito genitore. Se non lo trova lì, continuerà a guardare verso l'alto fino a raggiungere l'oggetto globale alla ricerca di quella variabile. Se tutte le variabili si trovano nello scope globale, il motore JavaScript dovrà sempre passare attraverso ogni ambito per raggiungere infine l'ambito globale per trovare la variabile.

Problemi correlati