¿Es posible definir una variable global en una función de JavaScript?
Quiero usar la trailimage
variable (declarada en la makeObj
función) en otras funciones.
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}
function hidetrail() {
var x = document.getElementById("trailimageid").style;
x.visibility = "hidden";
document.onmousemove = "";
}
function followmouse(e) {
var xcoord = offsetfrommouse[0];
var ycoord = offsetfrommouse[1];
var x = document.getElementById("trailimageid").style;
if (typeof e != "undefined") {
xcoord += e.pageX;
ycoord += e.pageY;
}
else if (typeof window.event != "undefined") {
xcoord += truebody().scrollLeft + event.clientX;
ycoord += truebody().scrollTop + event.clientY;
}
var docwidth = 1395;
var docheight = 676;
if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
x.display = "none";
alert("inja");
}
else
x.display = "";
x.left = xcoord + "px";
x.top = ycoord + "px";
}
if (obj_selected = 1) {
alert("obj_selected = true");
document.onmousemove = followmouse;
if (displayduration > 0)
setTimeout("hidetrail()", displayduration * 1000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
</form>
</body>
</html>
var
no declara una variable global. Una consecuencia de asignar un valor a una variable no declarada es la creación de una propiedad en el objeto global, que es muy diferente a declarar una variable.Respuestas:
Sí, como han dicho los demás, puede usarlo
var
a nivel global (fuera de todas las funciones) para declarar una variable global:Alternativamente, puede asignar a una propiedad en
window
:... porque en los navegadores,
todas las variablesglobales variables globales declaradas convar
son propiedades delwindow
objeto. (En la última especificación, ECMAScript 2015, el nuevolet
,const
yclass
declaraciones en el ámbito global crear variables globales que no son propiedades del objeto global, un nuevo concepto en ES2015).(También existe el horror de los globales implícitos , pero no lo haga a propósito y haga todo lo posible para evitar hacerlo por accidente, tal vez utilizando ES5
"use strict"
).Todo lo dicho: evitaría las variables globales si es posible (y casi seguro que puede). Como mencioné, terminan siendo propiedades de
window
, ywindow
ya está lo suficientemente lleno de gente con todos los elementos con unid
(y muchos con solo unname
) que se vierten en él (e independientemente de la próxima especificación, IE descarta casi cualquier cosa con un contenidoname
allí) )En cambio, envuelva su código en una función de alcance y use variables locales para esa función de alcance, y haga que sus otras funciones se cierren dentro de ella:
fuente
window
no funcionará en Node. El truco más fácil aquí es establecer:GLOBAL.window = GLOBAL;
- como se explica en esta pregunta relacionada . Por supuesto, no es bastante conceptual. Prefiero hacer las cosas al revés, por lo que puedo usar enGLOBAL
lugar dewindow
.window.yourGlobalVariable = ...;
funciona de maravilla después de leer 5 a 6 preguntas en el sitio de pila.eval
allí. En cambio:window[dynamic_variable_name] = dynamic_variable_value;
ACTUALIZACIÓN1: si lee los comentarios, hay una buena discusión sobre esta convención de nomenclatura en particular.
ACTUALIZACIÓN2: Parece que desde que se publicó mi respuesta, la convención de nombres se ha vuelto más formal. Las personas que enseñan, escriben libros, etc. hablan de
var
declaración yfunction
declaración.ACTUALIZACIÓN3: Aquí está la publicación adicional de Wikipedia que respalda mi punto: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... y para responder a la pregunta principal. DECLARE la variable antes de su función. Esto funcionará y cumplirá con la buena práctica de declarar sus variables en la parte superior del alcance :)
fuente
definition
ydeclaration
media en C. Su primera línea podría ser una declaración o una definición (dependiendo de donde está); el segundo es solo una tarea. Una declaración solo especifica la interpretación del identificador (es decir,myVar
es unint
); si la declaración también reserva almacenamiento, es adefinition
. Esto no está relacionado con la escritura; Es parte de cómo las unidades de compilación entienden las referencias a otras unidades de compilación.var myVar
se llama declaración (no es necesario escribirla) ymyVar = 10
una asignación . He escuchado el término "definición" para el compuesto (var myVar = 10;
).Solo declara
fuera de. Entonces
Espero que esto ayude.
fuente
No puedes. Simplemente declare la variable fuera de la función. No tiene que declararlo al mismo tiempo que asigna el valor:
fuente
window
son sinónimos. De cualquier manera, la distinción semántica que está haciendo es clara, por lo que no me importa dejar de votar. Editar: no se puede cambiar mi voto, lo siento.var
, que es lo que Guffa quiso decir implícitamente crear (como @DhruvPathak también señaló allí).Simplemente declare fuera de las funciones y asigne valores dentro de las funciones. Algo como:
O simplemente eliminar "var" de la función interna de su nombre de variable también lo hace global, pero es mejor declararlo afuera una vez para obtener un código más limpio. Esto también funcionará:
Espero que este ejemplo explique más: http://jsfiddle.net/qCrGE/
fuente
Es muy simple definir la variable trailimage fuera de la función y establecer su valor en la función makeObj. Ahora puede acceder a su valor desde cualquier lugar.
fuente
Me doy cuenta de que probablemente hay muchos errores de sintaxis en esto, pero es la idea general ... Muchas gracias LayZee por señalar esto ... Puede encontrar lo que es un almacenamiento local y de sesión en http: //www.w3schools. com / html / html5_webstorage.asp . He necesitado lo mismo para mi código y esta fue una muy buena idea.
fuente
location.reload(false);
actualizarla repetidamente.Ejemplo clásico:
Ejemplo moderno y seguro siguiendo las mejores prácticas utilizando un IIFE :
Hoy en día, también existe la opción de usar la API de WebStorage
o
En cuanto al rendimiento, no estoy seguro de si es notablemente más lento que almacenar valores en variables.
Soporte generalizado del navegador como se indica en ¿Puedo usar ...
fuente
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
yvar foo = JSON.decode(localStorage.foo);
.localStorage
tiene que ver con las variables globales?Entonces, ¿desea que la variable dentro de la función esté disponible fuera de la función? ¿Por qué no devolver los resultados de la variable dentro de la función?
var x = function returnX { var x = 0; return x; }
es la idea ...No he probado esto, pero si su código funcionó antes de ese pequeño cambio, entonces debería funcionar.
fuente
Aquí hay un código de muestra que puede ser útil.
Aquí encontré una buena respuesta How-can-one-declare-a-global-variable-in-JavaScript
fuente
Aquí hay otro método fácil para hacer que la variable esté disponible en otras funciones sin tener que usar variables globales:
fuente
Si está realizando una función de inicio, puede definir funciones y variables globales de la siguiente manera:
Debido a que la función se invoca globalmente con este argumento, este es el alcance global aquí. Entonces, el algo debería ser algo global.
fuente
this
estáundefined
en modo estricto fuera de una función y no debe usarse para referirse al objeto global.