la compilacion tiene 3 pasos:
Lo que tenemos que tener en cuenta es que JavaScript no tiene la ventaja que otros lenguajes de programacion tienen de que el proceso de compilacion esta desconectado del proceso de ejecucion, esto ayuda a que puedan hacer muchas optimizaciones y el tiempo de compilacion no sea tan relevante. en JavaScript, la compilacion ocurre siempre antes de ser ejecutado y muchas veces ocurre en microsegundos, y justo despues se ejecuta nuestro programa.
ReferenceError
Strict Mode
o no
Strict Mode
, recibiras un error de tipo ReferenceError
Strict Mode
, el scope “global” creara una variable nueva y se la devolvera a “engine”null
o undefined
), “engine” devolvera un error de tipo TypeError
ReferenceError
es un error de look-up, y TypeError
es un error por querer hacer una accion imposible.cuando hacemos un look-up, siempre empezamos desde el scope mas interno y vamos subiendo hasta encontrar la variable (o no). Hay que tener en cuenta que este look-up siempre se detendra al primer encuentro de variable, esto se le conoce como “shadowing”
var a = 3;
function hello(b) {
var a = 2;
console.log(a, b);
}
hello(1); // 2, 1
a
, como dentro de hello
existe una, el valor que optiene “engine” es 2
y no la declarada fuera de la funcion hello
eval()
o usando with
(deprecado)eval()
var a = 3;
function hello(str, b) {
eval(str);
console.log(a, b);
}
hello("var a = 2", 1); // 2, 1
with
{}
, siempre y cuando haya alguna asignacion dentro.dependiendo de que tipo de asignacion veamos, tendremos diferentes resultados
var name = "Horacio";
{
var name = "Juan";
console.log(name); // Juan
}
console.log(name); // Juan
var
, estas asignaciones solo respetan los ambitos de ejecucion de funciones, y no los bloques simples (ejemplo arriba). Esto pasa porque las asignaciones de tipo var
son elevadas al contexto de ejecucion de la funcion padre (en el ejemplo a window
)let
o const
, veremos que si que se respeta el ambito en el que esta presente la declaracion, y por tanto obtenemos diferences resultados en el console.log
. let
y const
si que son elevadas tambien, pero nolet name = "Horacio";
{
let name = "Juan";
console.log(name); // Juan
}
console.log(name); // Horacio
let
y const
, pero si que puedes modificar el valor siempre y cuando sea un objeto, gracias a que let
y const
trabajan sobre las [[javascript-referencias]] y no sobre el valor en si. En el caso de const
si lo usamos con [[javascript-tipos-primitivos]] ya no se puede cambiar o re-asignaruna forma de crear un nuevo scope es con los brackets:
{
let foo = "foo";
console.log("foo: ", foo);
}
let
o const
dentrolet
var
, let
solo se crea en el ambito en el que esta, y no en el ambito de la funcion como lo hace var
.un caso claro en el que var
funciona mejor, o esta mas alineado con su proposito que let
es dentro de bloques try/catch
.
function fetchCall(url) {
let response;
try {
response = fetch(url);
} catch (e) {
response = e;
}
return response;
}
fetchCall("google.com");
let
no se esta usando como deberia. en este caso en el que necesitas una variable para todo el scope de la funcion, var
es la herramienta correcta o el tipo de variable correcto a utilizar.const
const
dentro de una funcion o un bloque de 4 lineas de codigo, estamos diciendo que esta variable no va a ser reasignada en esas unicas 4 lineas de codigo, porque const
solo existe dentro del ambito en el que se creo.