var example = 'Hi'
function change() {
example = 'You'
console.log(example)
}
change() // 'You'
console.log(example) // 'You'
Tanto la función invocada como el console.log() se refieren a una variable del contexto global
var example = 'Hi'
function change() {
var example = 'You'
console.log(example)
}
change() // 'You'
console.log(example) // 'Hi'
La función invocada se refiere a una variable del contexto
local, porque ha sido declarada dentro de la función (añadiendo el
var = ...
)
El console.log() se refiere a la variable example
declarada en el contexto
global
function change() {
var example = 'You'
console.log(example)
}
change() // 'You'
console.log(example) // ReferenceError
La función invocada se refiere a una variable del contexto local, exactamente igual que en el ejemplo anterior.
El console.log() se refiere a la variable example
declarada en el contexto
global, pero como no hay ninguna variable declarada con ese nombre, tenemos
un error de referencia: example is not defined
console.log(example) // Undefined
var example = 'Hi'
El hoisting de var provoca que la variable example
, aun
estándo declarada debajo del console.log(), "suba" y se reconozca como una variable
declarada pero sin valor asignado (undefined), el cual recibe en la línea siguiente.
console.log(example) // Undefined
if (false) {
var example = 'Hi'
}
En este caso, example
también es undefined, porque de nuevo el hoisting alza la variable declarada dentro del if
y se reconoce como declarada pero no inicializada.
IMPORTANTE: Esto nos indica que en los if, for, switch, while
, etc. NO SE CREA OTRO CONTEXTO DE EJECUCIÓN, como sí pasa con las funciones, tal y como vimos en los ejemplos superiores, donde tenemos ReferenceError, ya que no se reconoce ninguna variable declarada con ese nombre. Por tanto, var
sólo afecta al ámbito local dentro de las funciones, en los demás casos afecta al global.
var saludar = "hey, hola";
var saludar = "dice Hola tambien";
var saludar = "dice Hola";
saludar = "dice Hola tambien";
var
, por ej. dentro de un if
si declaramos una let example = 'Hi';
y hacemos fuera un console.log(example), no la va a encontrar y va a dar un ReferenceError, porque se queda sólo dentro de ese bloque y no traspasa al ámbito global.
null
y undefined
let string1 = 'Hi';
let string2 = string1; // string2 adquiere el valor de string1, pero no la referencia de string1
string1 = 'Bye';
console.log(string2); // 'Hi'
Como string2
no adquiere la referencia de string1
(ocupan diferentes posiciones en memoria), no "sabe" cuándo ha actualizado su valor y por tanto se queda solo con el primer valor asignado.
let obj = {a: 1, b: 2};
let objRef = obj;
obj.a = 4;
console.log(objRef.a); // 4
objRef
es una copia de obj (ocupan el mismo espacio en memoria), por tanto, al tener la misma referencia, si se actualiza el valor de uno se actualiza también el del otro.