Perché le variabili globali sono considerate cattive pratiche?

Continuo a vedere gli avvertimenti di non usare le variabili globali in JavaScript, ma sembra che l’unica ragione per cui la gente lo dica sia perché blocca lo spazio dei nomi globale. Posso immaginare che possa essere risolto facilmente inserendo tutte le variabili in un unico big 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?

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 cosa negativa, 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. Questo diventa ancora peggiore quando entri in un mondo implicito (es. Quando dici someVar = someValue senza dichiarare someVar con la parola chiave var ).

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

Per ulteriori approfondimenti e una spiegazione più approfondita del perché i globals sono considerati una ctriggers pratica, potresti voler dare un’occhiata a questa pagina .

Le variabili globali possono aumentare significativamente l’accoppiamento, riduce significativamente la scalabilità e la testabilità del codice. Una volta che inizi a utilizzare i globals, ora devi sapere dove e come viene modificata la variabile (cioè interrompere l’incapsulamento). La maggior parte della letteratura e delle convenzioni là fuori sosterrà che le prestazioni sono l’ultima delle preoccupazioni quando si usano i globali.

Questo è un fantastico articolo che spiega perché le variabili globali causano mal di testa.

Se il tuo script è molto lungo e utilizzi queste variabili da molte funzioni, aumenterà il tuo tempo di debug poiché il valore della variabile globale potrebbe essere stato modificato da qualsiasi posizione, quindi se stai monitorando la posizione in cui questo è cambiato in un valore non previsto tu? Dovremo controllarli tutti.

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

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

1) Collisioni di nomi variabili: se lavori su un team e tu e il tuo collega di lavoro usate lo stesso nome di variabile sull’ambito globale, la variabile definita per ultima sovrascriverà la variabile iniziale. Questo ovvio può avere conseguenze devastanti.

2) Sicurezza – Specificamente sul web, ogni utente ha accesso all’object 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’object 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.

Non dovrebbe esserci alcun problema nell’uso di variabili globali nel codice, purché le si avvolga all’interno di un object / un object uniqe (per evitare la collisione con script che non sono tuoi)

C’è un accanimento nell’usare la variabile globale in javascript e deriva dal fatto che javascript non è un linguaggio di tipo forte. in questo caso, se si passa a soma oggetti complessi come argomenti di una funzione, si perderà probabilmente tutta l’intellisenza di quegli oggetti (all’interno dell’ambito della funzione). mentre si usano invece oggetti globali, si conserverà quell’intelligenza. e quando hai l’intelisence, in realtà può migliorare il tempo di debugging (al contrario di quello che altri hanno detto …)

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

(Naturalmente, si dovrebbe sempre fare il giusto equilibrio tra le variabili locali e globali)

Fondamentalmente, perché è ansible accedervi da qualsiasi script sulla pagina e perché è ansible ripetere il nome nello stesso ambito. Ecco perché molti motori Javascript utilizzano questo codice:

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