2009-06-03 13 views
76

Necesito algunas variables globales que necesito en todos los archivos .js.Cómo declarar una variable global en un archivo .js

Por ejemplo, considere los 4 ficheros siguientes:

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

¿Hay alguna manera de que pueda declararse 3 variables globales en global.js y acceder a ellos en cualquiera de t los otros 3 .js archivos considerando cargar todos los 4 archivos anteriores en un documento HTML?

¿Alguien me puede decir si esto es posible o hay un problema para lograrlo?

Respuesta

84

Basta con definir las variables en global.js fuera de un ámbito de la función:

// global.js 
var global1 = "I'm a global!"; 
var global2 = "So am I!"; 

// other js-file 
function testGlobal() { 
    alert(global1); 
} 

Para asegurarse de que esto funciona tiene que incluir/enlace a global.js antes de intentar acceder a las variables definidas en ese archivo:

<html> 
    <head> 
     <!-- Include global.js first --> 
     <script src="/YOUR_PATH/global.js" type="text/javascript"></script> 
     <!-- Now we can reference variables, objects, functions etc. 
      defined in global.js --> 
     <script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script> 
    </head> 
    [...] 
</html> 

usted podría, por supuesto, enlace en el guión etiquete justo antes del cierre <cuerpo> -tag si no desea que la carga de archivos js-interrumpir la carga de la página inicial.

+4

Si bien esta respuesta es correcta, le recomiendo que consulte el alcance variable de Google Javascript para obtener una mejor comprensión y posiblemente evitar hacer las cosas de esta manera. – aleemb

+1

de acuerdo. Siempre trato de delimitar todas las funciones y variables en un "espacio de nombres" común para evitar el desorden y los conflictos. Normalmente lo nombro como una abreviación del proyecto o empresa. – PatrikAkerstrand

+0

Downvoting this answer y otros similares porque asume que la variable global va a crearse en un ámbito global, y también requiere que la primera mención de la variable esté en el ámbito global antes que todas las demás menciones. – Andrew

6

¿Lo has probado?

Si lo hace:

var HI = 'Hello World'; 

En global.js. Y luego hacer:

alert(HI); 

En js1.js Se alerta que bien. Solo debe incluir global.js antes del resto en el documento HTML.

El único inconveniente es que tiene que declararlo en el ámbito de la ventana (no dentro de ninguna función).

Puede limpiar la parte var y crearlos de esa manera, pero no es una buena práctica.

2

Sí, puede acceder a ellas. Usted debe declarar en 'espacio público' (fuera de cualquier función) como:

var globalvar1 = 'value'; 

Se puede acceder a ellos más adelante, también en otros archivos.

78

Lo que se recomienda es:

window.greeting = "Hello World!" 

A continuación, puede acceder a él dentro de cualquier función: se prefiere

function foo() { 

    alert(greeting); // Hello World! 
    alert(window["greeting"]); // Hello World! 
    alert(window.greeting); // Hello World! (recommended) 

} 

Este enfoque por dos razones.

  1. La intención es explícita. El uso de la palabra clave var puede llevar fácilmente a declarar global vars que se pretendía que fuera local o viceversa. Este tipo de alcance variable es un punto de confusión para muchos desarrolladores de Javascript. Como regla general, me aseguro de que todas las declaraciones de variables estén precedidas por la palabra clave var o el prefijo window.

  2. Usted estandariza esta sintaxis para leer las variables de esta manera, lo que significa que un var con alcance local no abarca el var global o viceversa. Por ejemplo lo que sucede aquí es ambigua:

 

greeting = "Aloha"; 

function foo() { 
    greeting = "Hello"; // overrides global! 
} 

function bar(greeting) { 
    alert(greeting); 
} 

foo(); 
bar("Howdy"); // does it alert "Hello" or "Howdy" ? 

Sin embargo, esto es mucho más limpio y menos propenso a errores (que en realidad no necesita recordar todas las reglas de alcance variables):

function foo() { 
    window.greeting = "Hello"; 
} 

function bar(greeting) { 
    alert(greeting); 
} 

foo(); 
bar("Howdy"); // alerts "Howdy" 
+0

¿Este tipo de declaración funcionará X-Browser? – nottinhill

+0

Adjuntar variables a la ventana debería funcionar en todos los navegadores (y también es el enfoque que tomo, ¡+1!). – Dandy

+1

@Dan, si declara "var testvar = 'hola';" fuera de una función, se agrega automáticamente al objeto ventana y se puede acceder a ella con "window.testvar". – zkent

3

Como se mencionó anteriormente, existen problemas con el uso del alcance más alto en el archivo de script. Aquí hay otro problema: el archivo de script se puede ejecutar desde un contexto que no es el contexto global en algún entorno de tiempo de ejecución.

Se ha propuesto asignar el global a window directamente. Pero eso también es en tiempo de ejecución dependiente de y no funciona en Node, etc. Muestra que la administración de variable global portátil necesita una consideración cuidadosa y un esfuerzo extra. ¡Quizás lo arreglen en futuras versiones de ECMS!

Por ahora, yo recomendaría algo como esto para apoyar la gestión global adecuada para todos los entornos de tiempo de ejecución:

/** 
* Exports the given object into the global context. 
*/ 
var exportGlobal = function(name, object) { 
    if (typeof(GLOBAL) !== "undefined") { 
     // Node.js 
     GLOBAL[name] = object; 
    } 
    else if (typeof(window) !== "undefined") { 
     // JS with GUI (usually browser) 
     window[name] = object; 
    } 
    else { 
     throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported."); 
    } 
}; 


// export exportGlobal itself 
exportGlobal("exportGlobal", exportGlobal); 

// create a new global namespace 
exportGlobal("someothernamespace", {}); 

Es una tipificación poco más, pero hace que su gestión variable de prueba del futuro global.

Descargo de responsabilidad: Parte de esta idea se me ocurrió al mirar versiones anteriores de stacktrace.js. Creo que también se puede usar Bower u otras herramientas para obtener una detección más confiable y menos hackosa del entorno de tiempo de ejecución.

Cuestiones relacionadas