Risposte:
Se devi generare variabili globali nel codice di produzione (che dovrebbe essere evitato) dichiarale sempre esplicitamente :
window.globalVar = "This is global!";
Mentre è possibile definire una variabile globale semplicemente omettendo var
(supponendo che non vi sia alcuna variabile locale con lo stesso nome), farlo genera un globale implicito , che è una brutta cosa da fare e genererebbe un errore in modalità rigorosa .
Se questa è l'unica applicazione in cui utilizzerai questa variabile, l'approccio di Felix è eccellente. Tuttavia, se stai scrivendo un plug-in jQuery, prendi in considerazione le variabili e le funzioni di "namespace" (dettagli sulle citazioni successive ...) necessarie sotto l'oggetto jQuery. Ad esempio, attualmente sto lavorando a un menu a comparsa jQuery che ho chiamato miniMenu. Pertanto, ho definito uno "spazio dei nomi" miniMenu
in jQuery e ho inserito tutto lì.
Il motivo per cui uso le virgolette quando parlo di spazi dei nomi javascript è che non sono realmente spazi dei nomi in senso normale. Invece, uso solo un oggetto javascript e inserisco tutte le mie funzioni e variabili come proprietà di questo oggetto.
Inoltre, per comodità, di solito sottopongo allo spazio dei nomi del plug-in uno i
spazio dei nomi per cose che dovrebbero essere utilizzate solo internamente al plug-in, in modo da nasconderlo agli utenti del plug-in.
È così che funziona:
// An object to define utility functions and global variables on:
$.miniMenu = new Object();
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();
Ora posso semplicemente fare $.miniMenu.i.globalVar = 3
o $.miniMenu.i.parseSomeStuff = function(...) {...}
ogni volta che devo salvare qualcosa a livello globale, e lo tengo ancora fuori dallo spazio dei nomi globale.
delete $.miniMenu
.:). Va bene?
delete $.miniMenu
.
EDIT La domanda riguarda JavaScript, la risposta riguarda jQuery, che è errata. Questa è una vecchia risposta, dai tempi in cui jQuery era molto diffuso.
Invece, raccomando di comprendere ambiti e chiusure in JavaScript
Vecchia, cattiva risposta: con jQuery puoi semplicemente farlo, indipendentemente da dove sia la dichiarazione:
$my_global_var = 'my value';
E sarà disponibile ovunque. Lo uso per creare gallerie di immagini veloci, quando le immagini sono diffuse in luoghi diversi, in questo modo:
$gallery = $('img');
$current = 0;
$gallery.each(function(i,v){
// preload images
(new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
$current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
$('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
$current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
$('#gallery').hide().html($gallery[$current]).fadeIn();
});
Suggerimento : esegui l'intero codice nella console in questa pagina ;-)
$current = 0;
all'inizio della funzione, quella successiva non funzionerà.
Ecco un esempio di base di una variabile globale a cui possono accedere le altre funzioni. Ecco un esempio dal vivo per te: http://jsfiddle.net/fxCE9/
var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);
function myFunction1() {
myVariable = 'Hello 1';
}
function myFunction2() {
myVariable = 'Hello 2';
}
Se lo stai facendo all'interno di una funzione ready () di jquery, assicurati che la tua variabile sia all'interno della funzione ready () insieme alle altre tue funzioni.
Dichiarare la variabile al di fuori delle funzioni
function dosomething(){
var i = 0; // can only be used inside function
}
var i = '';
function dosomething(){
i = 0; // can be used inside and outside the function
}
Il modo migliore è usare closures
, perché l' window
oggetto diventa molto, molto ingombro di proprietà.
html
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="init.js"></script>
<script type="text/javascript">
MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
</script>
<script src="script.js"></script>
</head>
<body>
<h1>Hello !</h1>
</body>
</html>
init.js (Basato su questa risposta )
var MYLIBRARY = MYLIBRARY || (function(){
var _args = {}; // private
return {
init : function(Args) {
_args = Args;
// some other initialising
},
helloWorld : function(i) {
return _args[i];
}
};
}());
script.js
// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);
alert(a);
Ecco il plnkr . Spero che sia d'aiuto!
window
è disponibile solo nei browser. Potresti modificare la tua risposta per farlo funzionare in tutti gli ambienti? Vedi Come ottenere l'oggetto globale in JavaScript?