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.
ReferenceErrorStrict Mode o no
Strict Mode, recibiras un error de tipo ReferenceErrorStrict Mode, el scope “global” creara una variable nueva y se la devolvera a “engine”null o undefined), “engine” devolvera un error de tipo TypeErrorReferenceError 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 helloeval() 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 dentroletvar, 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.constconst 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.