Necesito algunas variables globales que necesito en todos los .js
archivos.
Por ejemplo, considere los siguientes 4 archivos:
global.js
js1.js
js2.js
js3.js
¿Hay alguna manera de declarar 3 variables globales global.js
y acceder a ellas en cualquiera de los otros 3 .js
archivos considerando que cargo los 4 archivos anteriores en un documento HTML?
¿Alguien puede decirme si esto es posible o hay una solución alternativa para lograrlo?
El enfoque recomendado es:
window.greeting = "Hello World!"
Luego puede acceder a él desde cualquier función:
function foo() { alert(greeting); // Hello World! alert(window["greeting"]); // Hello World! alert(window.greeting); // Hello World! (recommended) }
Se prefiere este enfoque por dos razones.
La intención es explícita. El uso de la
var
palabra clave puede conducir fácilmente a declarar globalesvars
que se pretendía que fueran locales o viceversa. Este tipo de alcance variable es un punto de confusión para muchos desarrolladores de Javascript. Entonces, como regla general, me aseguro de que todas las declaraciones de variables estén precedidas por la palabra clavevar
o el prefijowindow
.También estandariza esta sintaxis para leer las variables de esta manera, lo que significa que un ámbito local
var
no golpea al globalvar
o viceversa. Por ejemplo, lo que sucede aquí es ambiguo: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 (realmente no necesita recordar todas las reglas de alcance de variables):
function foo() { window.greeting = "Hello"; } function bar(greeting) { alert(greeting); } foo(); bar("Howdy"); // alerts "Howdy"
fuente
¿Lo has probado?
Si lo haces:
var HI = 'Hello World';
En
global.js
. Y luego haz:En
js1.js
él lo alertará bien. Solo debes incluirglobal.js
antes el resto en el documento HTML.El único inconveniente es que debe declararlo en el alcance de la ventana (no dentro de ninguna función).
Podría simplemente rechazar la
var
pieza y crearla de esa manera, pero no es una buena práctica.fuente
Como se mencionó anteriormente, existen problemas con el uso del alcance más alto en su archivo de script. Aquí hay otro problema: el archivo de secuencia de comandos puede ejecutarse 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 depende del tiempo de ejecución y no funciona en Node, etc. Esto demuestra que la administración de variables globales portátiles necesita una consideración cuidadosa y un esfuerzo adicional. ¡Quizás lo arreglen en futuras versiones de ECMS!Por ahora, recomendaría algo como esto para admitir una administració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 un poco más mecanografiado, pero hace que su gestión de variables globales esté preparada para el futuro.
Descargo de responsabilidad: parte de esta idea se me ocurrió al mirar versiones anteriores de stacktrace.js .
Creo que también se puede usar Webpack u otras herramientas para obtener una detección más confiable y menos pirateada del entorno de tiempo de ejecución.
fuente
GLOBAL
ahora está en desuso yglobal
debería usarse en su lugar.Sí, puedes acceder a ellos. Debe declararlos en 'espacio público' (fuera de cualquier función) como:
var globalvar1 = 'value';
Puede acceder a ellos más adelante, también en otros archivos.
fuente