Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con variables globales!

Estas en el tema de Problema con variables globales! en el foro de Javascript en Foros del Web. Buena noche. Hasta donde entiendo, una variable es global si se declara fuera de un ámbito cualquiera; o sea, fuera de {}. Y local si ...
  #1 (permalink)  
Antiguo 09/05/2014, 21:09
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Problema con variables globales!

Buena noche.

Hasta donde entiendo, una variable es global si se declara fuera de un ámbito cualquiera; o sea, fuera de {}. Y local si se declara dentro de {}.

¿Existen restricciones al respecto o por qué a veces me funcionan las variables globales y a veces no?

Un ejemplo de cuándo funcionan bien se encuentra aquí . Pero he aquí mi código:

Código Javascript:
Ver original
  1. inputA = document.getElementById("inputA"); // Y es indiferente si las declaro o no con "var".
  2. inputB = document.getElementById("inputB");
  3.  
  4.     function x()
  5.     {
  6.         inputA.style.display = "none";
  7.         inputB.style.color = "red";
  8.     }


Por ejemplo, si llamo la función al hacer clic en algún lado, el inputA y el inputB no modifican su estilo, es decir, no jala la función. Ésta funciona sólo si las variables se declaran en su interior.

¿No quedamos que si las declaro fuera de cualquier ámbito, en este caso fuera de la función x(), son globales?




Saludos!
  #2 (permalink)  
Antiguo 09/05/2014, 22:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con variables globales!

Solo por curiosidad, ¿Ejecutas esa función o la dejas así? Porque probé ejecutándola y funciona bien. El tema del ámbito es correcto, solamente tienes que ejecutarla. Puedes hacerlo de cualquiera de estas dos maneras:

Código Javascript:
Ver original
  1. //Función autoejecutable
  2. (function x()
  3. {
  4.     inputA.style.display = "none";
  5.     inputB.style.color = "red";
  6. })();
  7.  
  8. //Forma tradicional
  9. x();

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 09/05/2014, 22:43
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Respuesta: Problema con variables globales!

Cita:
Iniciado por Alexis88 Ver Mensaje
Solo por curiosidad, ¿Ejecutas esa función o la dejas así? Porque probé ejecutándola y funciona bien...

Qué pasó maestro!

Tienes razón maestro, traté de ser tan breve, que me pasé .

Pero el siguiente código no funciona:

Código Javascript:
Ver original
  1. inputA = document.getElementById("inputA"); // Y es indiferente si las declaro o no con "var".
  2.     inputB = document.getElementById("inputB");
  3.  
  4.     function x()
  5.     {
  6.         inputA.style.display = "none";
  7.         inputB.style.color = "red";
  8.     }
  9.     function y()
  10.     {
  11.         inputA.style.visibility = "hidden";
  12.         inputB.style.color = "green";
  13.     }

Código HTML:
Ver original
  1. <a href="#n" onclick="return x()">CLIC 1</a>
  2.     <a href="#n" onclick="return y()">CLIC 2</a>
  3.  
  4.     <input id="inputA" value="HOLA 1" />
  5.     <input id="inputB" value="HOLA 2" />


Última edición por berkeleyPunk; 09/05/2014 a las 22:50
  #4 (permalink)  
Antiguo 09/05/2014, 22:50
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con variables globales!

¿Y de casualidad incluyes al archivo JS en la cabecera o antes de la etiqueta </body>? Porque si fuera lo primero, todo el código debería de ejecutarse luego de cargar la ventana, para lo cual tendrías que colocarlo dentro de una función.

Código Javascript:
Ver original
  1. //Forma 1
  2. window.addEventListener("load", function(){
  3.     //Código del script
  4. }, false);
  5.  
  6. //Forma 2
  7. window.onload = function(){
  8.     //Código del script
  9. };

Esto es porque si el archivo JS es incluido en la cabecera del documento HTML y el código que contiene dicho archivo, no lo colocas en una función como las 2 que muestro, entonces nada de dicho archivo JS surtirá efecto en el documento HTML. Personalmente, prefiero colocar mis scripts justo antes de la etiqueta </body>.

Y disculpa por lo otro, no fue con ánimos de ofender, solo pregunté por si las moscas.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 09/05/2014 a las 23:27 Razón: Fe de errata
  #5 (permalink)  
Antiguo 09/05/2014, 23:07
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: Problema con variables globales!

Cita:
Iniciado por Alexis88 Ver Mensaje
¿Y de casualidad incluyes al archivo JS en la cabecera o antes de la etiqueta </body>?...
Justo antes que postearas esto, Alexis88, modifiqué la réplica que tú contestas. Ahí puse un código, que ciertamente no funciona y que se parece más al código que en verdad estoy trabajando.

Hice mis pruebas con este nuevo código y veo que tienes razón, sí funciona si pongo el javascript hasta abajo.

Esta jugada, de poner el JS hasta abajo del documento, ¿funciona igual si el JS lo incluyes mediante un archivo externo? ¿O sea, poner el <script type="text/javascript" src="js.js"></script> hasta abajo, y no en dentro del <head>?

Lo pregunto porque esto fue lo que intenté con mi código original, pero no me funcionó. De cualquier forma, ahora veo dónde está el conflicto. ¡Y juro que no me vuelve a pasar !

Te reitero la pregunta: ¿Esta jugada funciona igual si el JS lo incluyes mediante un archivo externo?

Última edición por berkeleyPunk; 09/05/2014 a las 23:18
  #6 (permalink)  
Antiguo 09/05/2014, 23:19
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con variables globales!

Claro, ya que al incluir un archivo externo, incluyes a su código, en otras palabras, es como si hicieras un copy/paste de dicho código en tu documento HTML. Particularmente, siempre incluyo a mis archivos JS justo antes de la etiqueta </body>, ahí no hay pierde.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 09/05/2014, 23:39
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Respuesta: Problema con variables globales!

Ok, seguro el problema es el que comentas.

El problema es que no logro hacer funcionar el código en el que trabajo. Y es que en éste la cosa se complica un poco más. Seré breve, por si acaso tienes algo que comentar.

Si al abrir index.php existe la variable A, entonces se hace un include de un php que muestra cierto contenido. Si al abrir index.php existe la variable B, entonces se hace otro include...

El php que se incluye con el include en el 1er caso, muestra un formulario sencillo en AJAX...

En pocas palabras, hay includes por todos lados y archivos que llaman otros archivos, así que la cosa resulta un poco más complicada, ya que no puedo simplemente poner el Javascript en el fondo del documento del index, porque, y ya lo hice, no funciona.

Ya puse el <script type="text/javascript" src="js.js"></script> al final de cada archivo que meto con include, y nada.

  #8 (permalink)  
Antiguo 09/05/2014, 23:44
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con variables globales!

¿En la consola se muestra algún mensaje de error? Y si no es así, coloca una alerta en el código JS que debería funcionar, para ver qué está sucediendo. Y por si las moscas, ¿En qué archivo están los campos que deseas afectar, en el archivo actual o en los que incluyes?
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 10/05/2014, 10:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Problema con variables globales!

Que pena si me meto mal....... tambien soy nuevo en JS... probé la sugerencia de @Alexis88 de usar el evento Onload() y me fue perfecto:

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <script language="JavaScript">
  4.    
  5.     function al_cargar()
  6.     {
  7.     var inputA = document.getElementById("inputA");
  8.     var inputB = document.getElementById("inputB");
  9.     }
  10.    
  11.     function x()
  12.     {      
  13.         inputA.style.display = "none";
  14.         inputB.style.color = "yellow";
  15.         alert('Entre');
  16.     }
  17. </script>
  18. </head>
  19. <body onload="al_cargar();">
  20.     <a href="#n" onclick="x()">CLIC 1</a>
  21.     <a href="#n" onclick="x()">CLIC 2</a>
  22.  
  23.     <input id="inputA" value="HOLA 1" />
  24.     <input id="inputB" value="HOLA 2" /></p>
  25. </body>
  26. </html>
__________________
Salu2!
  #10 (permalink)  
Antiguo 10/05/2014, 12:15
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: Problema con variables globales!

Cita:
Iniciado por Italico76 Ver Mensaje
...probé la sugerencia de @Alexis88 de usar el evento Onload() y me fue perfecto...

Qué onda Italico76. Sí, funciona la recomendación de Alexis88, pero si complicamos el ejemplo, como mencioné más arriba, metiendo includes por otros lados, ya no.


Acabo de encontrar otro ejemplo de problema con las variables globales . Esto:
Código HTML:
Ver original
  1.     <title></title>
  2. </head>
  3.     <b id="texto" onmouseover="x()">Poner el cursor aquí</b>
  4.  
  5.     <script type="text/javascript">
  6.         var x = document.getElementById("texto");
  7.  
  8.         function x()
  9.         {
  10.             x.style.color = "red";
  11.         }
  12.     </script>
  13. </body>
  14. </html>

Esto no sirve (y conste que el script está en el fondo del doc). Sólo funciona si se declara la variable x dentro de la función. Alexis88, ¿puedes explicar esto?

En la consola sale un error no detectado:
Uncaught ReferenceError: x is not defined y.html:6
onmouseover
  #11 (permalink)  
Antiguo 10/05/2014, 12:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Problema con variables globales!

Master @berkeleyPunk

Me vuelvo a meter... los includes() en PHP no tienen nada que ver....... excepto estes metiendo tambien codigo JS ahi por ejemplo

Seria bueno saber que incluyes y en que parte lo haces (arriba, abajo ?)
__________________
Salu2!
  #12 (permalink)  
Antiguo 10/05/2014, 12:36
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Problema con variables globales!

En javascript no existen el ámbito de las variables, existen "closures" que es un concepto muy parecido pero mucho más complicado (y que permite a la vez códigos increíblemente potentes imposibles de emular en otros muchos lenguajes), idea que se usó por primera vez en el lenguaje SCHEME,de los años 70, y del que javascript coge muchas ideas.
https://developer.mozilla.org/es/doc...Guide/Closures

Las variables que crees sin ponerles un "var" delante, no son variables globales, son atributos que le estás creando al objeto "window", que es uno de los pocos objetos globales de la aplicación.

Código Javascript:
Ver original
  1. valor1=4;
es lo mismo que
Código Javascript:
Ver original
  1. window.valor1=4;
ó
Código Javascript:
Ver original
  1. window["valor1"]=4;

Usa siempre "var" en la creación de variables, estén donde estén, así no se las estás metiendo al objeto window, y no perderás el control de tu código.

Por otro lado, para evitar problemas como el que posteas en tu último comentario, olvidate de usar los aributos HTML "style" y "on" + el evento que sea.

Los estilos, a la hoja de estilos SIEMPRE, y el javascript, a su archivo .js o etiqueta <script>, si no quieres cojnseguir un código horrible de seguir y modificar.

Para capturar eventos, usa sus objeto.onloquesea=function(e){ ... }
o objeto.addEventListener u objeto.attachEvent (Explorer viejos).
  #13 (permalink)  
Antiguo 10/05/2014, 12:57
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Problema con variables globales!

Ok, ok, en mi último comentario mostraba otro problema con las variables globales. Y ya vi cuál es el problema de todo.

Por un lado, Italico76 comentó hace un rato que los includes no tienen nada que ver, a menos que mediante ellos se metiera más JS. Y éste es el caso, así que era posible que sí tuvieran algo que ver.

Por otro lado, resulta que si la función tiene el mismo nombre que la variable que se quiere declarar como global, la cosa va mal. Por eso en el código que puse en el último comentario que hice, no funciona el javascript.


  #14 (permalink)  
Antiguo 10/05/2014, 12:58
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Problema con variables globales!

Cita:
Iniciado por berkeleyPunk Ver Mensaje
Qué onda Italico76.
Acabo de encontrar otro ejemplo de problema con las variables globales . Esto:
Código HTML:
Ver original
  1.     <title></title>
  2. </head>
  3.     <b id="texto" onmouseover="x()">Poner el cursor aquí</b>
  4.  
  5.     <script type="text/javascript">
  6.         var x = document.getElementById("texto");
  7.  
  8.         function x()
  9.         {
  10.             x.style.color = "red";
  11.         }
  12.     </script>
  13. </body>
  14. </html>

Esto no sirve (y conste que el script está en el fondo del doc).
Claro que no sirve, se crea la variable x y luego se trata de sobre escribir como función.

Algo así resuelve el problema

Código Javascript:
Ver original
  1. var y = document.getElementById("texto");
  2.  
  3.         function x()
  4.         {
  5.             y.style.color = "red";
  6.         }

No sé con qué depures, pero si usas firebug te será de mucha utilidad.
  #15 (permalink)  
Antiguo 10/05/2014, 13:12
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Respuesta: Problema con variables globales!

Cita:
Iniciado por ocp001a Ver Mensaje
Claro que no sirve, se crea la variable x y luego se trata de sobre escribir como función...

Eso es lo que descubrí un segundo antes que postearas esto, ocp001a, y gracias por responder.

Pero uno pensaría que lo que comentas no debería ser así. Lo digo por lo siguiente. Primero informo en el script que voy a declarar una variable, var x. Y después informo que voy a decalrar una función, function x(). Como digo, uno pensaría que no debería haber confusión ni error, porque aunque ambas cosas lleven el mismo nombre, son tipos distintos.

Digo, uno pensaría que habría problema si después de poner el código como lo puse, añadiéramos, no sé, algo como:
Código Javascript:
Ver original
  1. var x = x();

¿No?
  #16 (permalink)  
Antiguo 10/05/2014, 13:21
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Problema con variables globales!

No son de distinto tipo. En JS, prácticamente todo son objetos, incluidas las funciones.
  #17 (permalink)  
Antiguo 10/05/2014, 13:27
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Problema con variables globales!

Cita:
Iniciado por berkeleyPunk Ver Mensaje
Digo, uno pensaría que habría problema si después de poner el código como lo puse, añadiéramos, no sé, algo como:
Código Javascript:
Ver original
  1. var x = x();

¿No?
Quizas por ser dinamicamente tipado.....

Código Javascript:
Ver original
  1. x = 5;
  2. x = 'Hola Mundo';
  3. alert(x);  // no hay error, sale "Hola Mundo"

Como Ud dice la funcion x, no es mas que un tipo de datos mas......

---
Sorprendente para mi tambien :)

Aca lo mismo, una vez mas...... descomentando x = ... y no imprime nada.

Código Javascript:
Ver original
  1. <html>
  2. <head> 
  3.     <script language="JavaScript">
  4.         function al_cargar()
  5.         {
  6.             function x(){
  7.                 return 'Hi world';
  8.             }
  9.             //x = 5;
  10.             //x = 'Hola Mundo';
  11.             alert(x());
  12.                
  13.         }      
  14.     </script>  
  15. </head>
  16. <body onload="al_cargar();">
  17.    
  18. </body>
  19. </html>
__________________
Salu2!
  #18 (permalink)  
Antiguo 10/05/2014, 13:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Problema con variables globales!

Cita:
Iniciado por marlanga Ver Mensaje
No son de distinto tipo. En JS, prácticamente todo son objetos, incluidas las funciones.
Ud sabe muchisismo..... y de hecho estoy aprendiendo de sus comentarios pero le voy a hacer una mini-corrección:

Objetos de distintas clases (incluidas funciones como ud dice) son tipos distintos
__________________
Salu2!

Última edición por Italico76; 10/05/2014 a las 13:35 Razón: PD: perdon por el DOBLE POST! no me di cuenta ya habia posteado xD
  #19 (permalink)  
Antiguo 10/05/2014, 13:59
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Problema con variables globales!

Bueno, el padre de todos los objetos de javascript es el objeto Object, así que todo queda en familia.
  #20 (permalink)  
Antiguo 14/05/2014, 15:08
Avatar de jp91  
Fecha de Ingreso: mayo-2014
Mensajes: 94
Antigüedad: 10 años
Puntos: 11
Respuesta: Problema con variables globales!

Mmmmmm en javascript todo actua como un objeto las unicas exepciones son null y undefined, practicamente en js no hay clases, eso solo lo hacen porque es un modelo al cual mucha personas estan acostumbradas, una funcion tiene una clase interna pero mas bn es una propiedad llamada Function y de tipo function, un objeto propiedad Object tipo object .
__________________
OOoo Como hacer ooOO
juegos con Html5.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:28.