2010-11-22 20 views
12

Per me è assolutamente logico utilizzarlo qui. Quale sarebbe l'alternativa? Come posso evitare di usarli e soprattutto perché è cattivo secondo jsLint fare uso di globals.Perché i globali sono cattivi?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

Potete aiutarmi a capire questo? E dammi una soluzione migliore?

risposta

18

Globali sono cattivi perché non causano problemi subito. Solo dopo, dopo averli usati dappertutto, causeranno problemi molto brutti - che non puoi più risolvere senza scrivere il tuo codice da zero.

Esempio: si utilizza $body per definire alcune funzioni. Funziona bene Ma alla fine, hai anche bisogno di un valore. Quindi usi $body.foo. Funziona bene. Quindi aggiungi $body.bar. E poi, qualche settimana dopo, hai bisogno di un altro valore per aggiungere $body.bar.

Test del codice e sembra funzionare. Ma in effetti, hai "aggiunto" la stessa variabile due volte. Questo non è un problema perché JavaScript non capisce il concetto di "creare una nuova variabile una volta". Sa solo "creare se non esiste già". Quindi si utilizza il codice e, infine, una funzione modificherà $body.bar interrompendo un'altra funzione. Anche trovare il problema ti richiederà molto tempo.

Ecco perché è meglio assicurarsi che le variabili possano essere viste solo in base alle necessità. In questo modo, una funzione non può rompere un'altra. Questo diventa più importante man mano che il tuo codice cresce.

2

si dovrebbe definire con var $ corpo, allora sarebbe locale nel campo di applicazione di tale funzione, senza var potrebbe essere sovrascritto da tutti

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

Oppure sovrascrivere qualche altra variabile globale denominata $ body – Mchl

+0

sì, ma in questo esempio sostituisce il valore globale, in questo modo lo nasconde solo nell'ambito della funzione – mpapis

+2

Una funzione letterale utilizzando le variabili locali dichiarate in lo stesso ambito in cui è stata definita la funzione è chiamato [chiusura] (http://jibbering.com/faq/notes/closures/), e dovrebbe essere ampiamente utilizzato in jQuery con grande effetto. – Phrogz

2

variabili globale potrebbero scontrarsi con altri script o essere sovrascritti . Quando non hai bisogno di un globale, è consigliabile evitarli. Basta usare var (o let se il JS-versione-di sostegno è superiore a 1,7):

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

Si potrebbe riscrivere che, come

var $body = $('body'); 

That (l'uso della parola chiave var) renderebbe una variabile locale, che è sufficiente per i tuoi scopi. Rimarrà comunque all'interno della portata del tuo callback each.

Il motivo per cui è inutile utilizzare i globals è che può essere sovrascritto da qualsiasi altra cosa. Affinché il tuo codice si adatti bene, dipende da quali altri script utilizzi. È preferibile mantenere la sceneggiatura il più autosufficiente possibile, con le dipendenze il meno possibile rivolte al mondo esterno.

0

jsLint è molto severo. Probabilmente non è necessario essere troppo presi da questo.

Ma se ti senti male, si può fare proprio come come si limitato l'ambito jQuery:

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

Sono d'accordo sul fatto che in generale non è necessario lavorare su tutto ciò che dice jsLint, ma non vorrei menzionarlo in questo contesto, perché sono davvero d'accordo sul fatto che se i globali possono essere evitati indolore, dovrebbero esserlo, e in questo codice la variabile può essere dichiarata come variabile locale e non è richiesta altra azione. –

+0

@David Hedlund: concordato – kizzx2

Problemi correlati