¿Cómo cambio el valor de una variable global dentro de una función?

131

Estoy usando JavaScript y creo una variable global. Lo defino fuera de una función y quiero cambiar el valor de la variable global desde dentro de una función y usarlo desde otra función, ¿cómo hago esto?

NullPoiиteя
fuente

Respuestas:

148

Simplemente haga referencia a la variable dentro de la función; sin magia, solo usa su nombre. Si se ha creado globalmente, entonces actualizará la variable global.

Puede anular este comportamiento declarándolo localmente usando var, pero si no lo usa var, el nombre de una variable utilizada en una función será global si esa variable se ha declarado globalmente.

Es por eso que se considera una buena práctica declarar siempre sus variables explícitamente var. Porque si lo olvida, puede comenzar a meterse con los globos por accidente. Es un error fácil de cometer. Pero en su caso, esto cambia y se convierte en una respuesta fácil a su pregunta.

Spudley
fuente
3
Esto no funciona para mí: country = 'foo' $ .ajax ({url: '/ some-endpoint', success: function (data) {country = data.country;}}); console.log (country) // salidas 'foo'
Mark Simpson
41
@MarkSimpson: la razón por la que no funciona es porque, en su ejemplo, console.logse ejecuta de inmediato, pero la función de éxito ajax solo se ejecuta en algún momento posterior cuando la llamada ajax realmente devuelve una respuesta. Este es un punto fundamental sobre la naturaleza asincrónica de ajax: el código en las funciones de cierre no se ejecuta en secuencia con el código que lo rodea. Es importante comprenderlo cuando se aprende sobre el código controlado por eventos.
Spudley
La forma de hacer que el console.log sea más preciso en este caso sería ponerlo dentro de la función de éxito ajax.
DWils
Otra de mis ideas brillantes: revisa la ortografía y el caso del nombre de la variable. Es muy fácil perder algo tan simple como sessionId vs sessionID.
whitebeard
Tengo el mismo problema en estos. Pero finalmente entendido, gracias @Spudley!
Yudhistira Bayu
63
var a = 10;

myFunction();

function myFunction(){
   a = 20;
}

alert("Value of 'a' outside the function " + a); //outputs 20
Chris
fuente
1
Gracias por este increíble ejemplo simple. La lógica de esto era hacerme la cabeza. Simplemente me acostumbré al pensamiento 4d.
Mikey3Strings
29

Solo usa el nombre de esa variable.

En JavaScript, las variables solo son locales para una función, si son los parámetros de la función o si las declara como locales explícitamente escribiendo la varpalabra clave antes del nombre de la variable.

Si el nombre del valor local tiene el mismo nombre que el valor global, use el windowobjeto

Ver este jsfiddle

x = 1;
y = 2;
z = 3;

function a(y) {
  // y is local to the function, because it is a function parameter
  console.log('local y: should be 10:', y); // local y through function parameter
  y = 3; // will only overwrite local y, not 'global' y
  console.log('local y: should be 3:', y); // local y
  // global value could be accessed by referencing through window object
  console.log('global y: should be 2:', window.y) // global y, different from local y ()

  var x; // makes x a local variable
  x = 4; // only overwrites local x
  console.log('local x: should be 4:', x); // local x
  
  z = 5; // overwrites global z, because there is no local z
  console.log('local z: should be 5:', z); // local z, same as global
  console.log('global z: should be 5 5:', window.z, z) // global z, same as z, because z is not local
}
a(10);
console.log('global x: should be 1:', x); // global x
console.log('global y: should be 2:', y); // global y
console.log('global z: should be 5:', z); // global z, overwritten in function a

Editar

Con ES2015 llegó dos palabras clave consty let, que también afectan el alcance de una variable ( Especificación del lenguaje )

Yunzen
fuente
1
+1 para describir la colisión de nombres entre la variable declarada global y local y cómo acceder a ella.
gdbj
6
<script>
var x = 2; //X is global and value is 2.

function myFunction()
{
 x = 7; //x is local variable and value is 7.

}

myFunction();

alert(x); //x is gobal variable and the value is 7
</script>
Iman Sedighi
fuente
Simplemente no use la varpalabra clave dentro de la función, entonces no tiene que lidiar condocument.getElementById("outside").value = x;
Ben Aubin
5
var a = 10;

myFunction(a);

function myFunction(a){
   window['a'] = 20; // or window.a
}

alert("Value of 'a' outside the function " + a); //outputs 20

Con window ['variableName'] o window.variableName puede modificar el valor de una variable global dentro de una función.

Sterling Diaz
fuente
¡Esta es la única forma en que podría cambiar el valor de la variable global en el componente angular!
Padmaraj Bhat