Foros del Web » Programando para Internet » Javascript »

Cambiar valor de una variable con una funcion interna

Estas en el tema de Cambiar valor de una variable con una funcion interna en el foro de Javascript en Foros del Web. Hola, que tal todos. Tengo dos variables var x=10 y var y=20, y con una funcion interna, tengo que hacer que "y" que no valga ...
  #1 (permalink)  
Antiguo 16/11/2020, 08:54
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 14 años, 6 meses
Puntos: 1
Cambiar valor de una variable con una funcion interna

Hola, que tal todos.
Tengo dos variables var x=10 y var y=20, y con una funcion interna, tengo que hacer que "y" que no valga 20, que sea igual a 15 pero no me sale.
Tengo dos alerts, los dos me dan 20, y lo que intendo hacer es que en el segundo alert (alert(y)) me salga 15, y esto sin tocar nada mas que la funcion "f2"



Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es">
  3.   <head>
  4.   <meta charset="utf-8">
  5.     <title>Funcions</title>
  6.   </head>
  7.   <body>
  8.   <script>
  9.    var x=10;
  10.    var y=20;
  11.    function f1(y){ //Segun como hago la llamada de esta funcion, ahora y vale 10
  12.       x=x+y; // esto seria: x=x+x dicho de otra menera: x=10+10
  13.       f2(); /ejecuto la funcion interna
  14.       function f2(){
  15.         y=y+5; //AQUI TENGO EL PROBLEMA, Realmente en el depurador me sale que y=15 pero ya fuera de la funcion f1 en el "alert(y)"  me da 20
  16.       }
  17.    }
  18.    f1(x);
  19.    alert(x);//20
  20.    alert(y);//20 pero aqui me tiene que salir 15
  21. </script>
  22. </body>
  23. </html>
Gracias.
Saludos!!!
  #2 (permalink)  
Antiguo 16/11/2020, 14:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.480
Antigüedad: 9 años, 3 meses
Puntos: 952
Respuesta: Cambiar valor de una variable con una funcion interna

Las alertas se ejecutan de forma síncrona, por lo cual no muestra el valor de y antes de que termine de ejecutarse la segunda función. Lo que necesitas hacer es utilizar una promesa para acceder de forma asíncrona a los valores actualizados luego de la ejecución de ambas funciones.

Código Javascript:
Ver original
  1. var x = 10,
  2.     y = 20;
  3.  
  4. function f1(y){
  5.     x = x + y;
  6.      
  7.     function f2(){
  8.         y = y + 5;        
  9.         return new Promise(c => c([x, y]));
  10.     }
  11.  
  12.     return f2();
  13. }
  14.  
  15. f1(x).then((z) => {
  16.     alert(z[0]); //20
  17.     alert(z[1]); //15
  18. });

DEMO

En la línea de retorno de la promesa, devuelvo ambos valores dentro de un arreglo puesto que no se puede devolver más de un valor excepto que se encapsulen todos en uno, como en un arreglo. Por ello es que accedo a ambos por medio de los índices 0 y 1 para mostrarlos en las alertas.

__________________
«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; 16/11/2020 a las 15:16 Razón: Explicación y enlace
  #3 (permalink)  
Antiguo 18/11/2020, 16:42
 
Fecha de Ingreso: abril-2011
Mensajes: 141
Antigüedad: 9 años, 10 meses
Puntos: 53
Respuesta: Cambiar valor de una variable con una funcion interna

Una opción es usar promesas como indica @Alexis88, pero se puede resolver de una forma más sencilla.

Cuando declaras la variable y como parámetro de la función f1, estás creando una variable local que nada tiene que ver con la variable y que habías definido arriba (en el scope global). Por tanto, los cambios que efectúes sobre esta variable local solamente serán visibles dentro de la función f1.

No obstante, si lo que quieres no es modificar la variable y local, sino la variable y global, deberás anteponer window.:

Código Javascript:
Ver original
  1. /* esto es el scope global */
  2. var x = 10;
  3. var y = 20; // al ser una variable global, la podemos referenciar como window.y
  4. function f1(y){
  5.   /* este es el scope local de la funcion f1 */
  6.   x = x + y;
  7.   f2();
  8.   function f2(){
  9.     window.y = y + 5; // cambiamos el valor de la variable global y
  10.   }
  11. }
  12. f1(x);
  13. alert(x); //20
  14. alert(y); //15

Este problema no lo tendrías si hubieras utilizado un nombre distinto de "y" para el parámetro de la función f1.

Código JavaScript:
Ver original
  1. /* esto es el scope global */
  2. var x=10;
  3. var y=20;
  4. function f1(z){ // ponemos otro nombre, por ej. z
  5.   /* este es el scope local de la funcion f1 */
  6.   x=x+z;
  7.   f2();
  8.   function f2(){
  9.     y = z+5; // como no una hay variable "y" declarada en f1, accede a la del scope superior (en este caso, el scope global)
  10.   }
  11. }
  12. f1(x);
  13. alert(x);//20
  14. alert(y);//15

Como habrás podido ver, el intérprete de JavaScript busca las variables desde abajo hacia arriba. Si intentas acceder a una variable X pero no la encuentra en el scope actual, buscará en el scope superior. Si llega al scope global y no encuentra la variable, lanzará un error: Reference Error: X is not defined.

Te recomiendo la siguiente lectura: https://yeisondaza.com/entendiendo-s...-en-javascript

Saludos



La zona horaria es GMT -6. Ahora son las 17:56.