2010-07-28 21 views

Respuesta

207

Si usted tiene que generar variables globales en el código de producción (que se deben evitar) siempre declararlos explícitamente:

window.globalVar = "This is global!"; 

Si bien es posible definir una variable global con sólo omitiendo var (suponiendo que no hay una variable local del mismo nombre), al hacerlo genera un implícito global, lo cual es algo malo de hacer y generaría un error en el modo estricto .

+0

'window' está disponible solo en los navegadores. ¿Podrías editar tu respuesta para que funcione en todos los entornos? Ver [Cómo obtener el objeto global en JavaScript?] (Http://stackoverflow.com/q/3277182/3853934) –

+0

** Nunca ** use camelCase, Earth es el principal espectáculo de circo del multiverso y alguien en algún lugar * lo hará * eventualmente estandariza tu [inserta el nombre del objeto loco aquí]. Se adhieren a los guiones como separadores en las URL y los guiones bajos para los separadores dentro del código ('window.class_list'). – John

50

Si esta es la única aplicación donde va a utilizar esta variable, el enfoque de Felix es excelente. Sin embargo, si está escribiendo un plugin de jQuery, considere las variables y funciones "namespacing" (detalles sobre las citas más adelante ...) necesarias en el objeto jQuery. Por ejemplo, actualmente estoy trabajando en un menú emergente jQuery al que he llamado miniMenu. Por lo tanto, he definido un "espacio de nombres" miniMenu en jQuery, y coloco todo allí.

La razón por la que uso comillas cuando hablo de espacios de nombres de JavaScript es que no son realmente espacios de nombres en el sentido normal. En cambio, solo uso un objeto javascript y coloco todas mis funciones y variables como propiedades de este objeto.

También, por conveniencia, por lo general subespacio del espacio de nombres plugin con un espacio de nombres i para la materia que sólo debe ser utilizado internamente dentro del plug-in, con el fin de ocultarlo de los usuarios del plugin.

Así es como funciona:

// 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(); 

Ahora sólo puede hacer $.miniMenu.i.globalVar = 3 o $.miniMenu.i.parseSomeStuff = function(...) {...} cada vez que necesito algo para salvar a nivel mundial, y todavía mantenerlo fuera del espacio de nombres global.

+0

Gracias por eso Tomas, en el sitio que mencioné anteriormente, el enfoque de Felix funciona bien, pero tengo otro sitio en el que también estoy trabajando que usa varios complementos y su enfoque sería ideal si puedo hacerlo funcionar. Saludos por su ayuda. – Dancer

+0

¡Esto funciona perfectamente bien! Solo asegúrate de que @Tomas dice: crea tu propia clase/titular para tus propias funciones o variables personalizadas. +1 – Pierre

+0

Gracias Tomas! Si no es necesario, elimine el objeto principal (por ejemplo, 'delete $ .miniMenu'). ¿Está bien? – KunJ

15

Aquí hay un ejemplo básico de una variable global a la que pueden acceder el resto de sus funciones. Aquí está un ejemplo vivo para usted: 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'; 
} 

Si usted está haciendo esto dentro de una función de jQuery ready(), entonces asegúrese de que su variable es dentro de la función ready() alongwith de sus otras funciones.

+0

La mejor respuesta sobre cómo funcionan las variables globales en jQuery. –

+0

Sé que estoy excavando la tumba, pero esto ni siquiera es una variable global explícita. Esto está más en sintonía con una variable pública compartida que no tiene un alcance para un cierre para scripts extremadamente pequeños. Son dos métodos/usos completamente diferentes y este le generará un gran problema si declara un global explícito en un script que está en medio de varios scripts diferentes. Solo puedo imaginar una interfaz en mi equipo que declare una variable global en la parte superior de un script que es el décimo que se llama al DOM. –

4

declarar la variable fuera de las funciones

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 
} 
19

con jQuery que sólo puede hacer esto, no importa en que la declaración es:

$my_global_var = 'my value'; 

y estará disponible en todas partes. lo uso para hacer galerías de imágenes rápidas, cuando las imágenes se difunden en diferentes lugares, así:

$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(); 
}); 

Consejo: ejecutar el código entero en la consola en esta página ;-)

+1

¿No son $ gallery y $ current solo variables globales normales? Funcionan porque los está definiendo como variables globales al omitir 'var', pero el signo de dólar frente a ellos no los convierte en 'variables jQuery' ... Literalmente pone un guión bajo o cualquier otro signo a partir de ellos ... Serían variables de jQuery si usa el objeto jQuery ($) y agrega una propiedad: $ .myGlobalVariable = 'my value' ... –

+0

Probablemente tenga razón, pero qué Vale la pena notar que usando la sintaxis $ myVar obtienes 2 adventages, 1) la variable es global sin ninguna declaración especial (además de $); y 2) puede rastrear sus variables globales muy fácilmente dentro del código. Abierto a discusión, aunque ... – aesede

3

El mejor manera es utilizar closures, porque el objeto window se pone muy, muy desordenado con propiedades.

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 (Basado en this answer)

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); 

Aquí está el plnkr. Espero que ayude!

Cuestiones relacionadas