Alcance léxico en JavaScript

Estoy un poco confundido sobre cómo funciona exactamente el alcance en JavaScript, principalmente el alcance léxico. Entiendo que las variables en el alcance global son accesibles desde cualquier lugar, y la única forma de crear un nuevo alcance en JavaScript es mediante la creación de funciones (o con let en ES6). Sin embargo, no entiendo realmente qué es / significa el ámbito léxico. He buscado en Internet y no he podido encontrar una explicación clara.

Siento que estoy empezando a entenderlo, pero permítanme confirmarlo con los asistentes de JavaScript para asegurarme de que estoy en lo correcto.

Entonces, según tengo entendido, el alcance léxico significa un alcance estático, por ejemplo, el alcance de una función no se crea por el lugar donde se llama sino por el lugar donde se crea la función. El siguiente código a continuación demuestra este concepto:

var x = "global";

function foo() {
   console.log(x);
}

function bar() {
   var x = "bar";
   foo();
}

function baz() {
   var x = "baz";
   foo();
}


bar();
baz();

Lo que se imprime en la consola es "global" dos veces. Esto se debe a que cuando se invoca la función foo, el intérprete primero verifica el alcance de foo para ver si tiene una variable "x" y luego verifica el alcance global, no el alcance bar o baz. La variable "x" se toma, no desde donde se llama la función foo, sino desde donde se crea, por lo tanto, tiene un alcance léxico. ¿Estoy en lo cierto, y esto tiene sentido?

Otro ejemplo de alcance léxico serían los cierres, ¿verdad? Entonces, por ejemplo, la función interna tiene acceso a las variables de la función externa, sin importar dónde se llame la función interna debido al alcance léxico, ¿correcto?

Finalmente, mi último ejemplo serían las funciones de flecha. Permiten el alcance léxico de "esto", ¿verdad? Así por ejemplo,

   var obj = {
       name: "Rob",
       print() {
       setTimeout(() => {
         console.log(this.name)
       }, 1000);
     }
   };

En lugar de que "this" esté vinculado al objeto global si fuera una función en línea estándar, "this" está obligado a obj debido al alcance léxico de "this" con funciones de flecha.

¿Todo lo que he dicho es correcto? Además, ¿alguien puede darme una definición clara del alcance léxico? ¿Hay otros ejemplos de alcance léxico en JavaScript que deba conocer?

Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta