Leyendo detalladamente este articulo <a href="https://medium.com/dailyjs/i-never-understood-javascript-closures-9663703368e8">https://med...

Pregunta de la clase:
Ámbito léxico en closures
Luis Gerardo Colmenares

Luis Gerardo Colmenares

Pregunta
studenthace 5 años

Leyendo detalladamente este articulo https://medium.com/dailyjs/i-never-understood-javascript-closures-9663703368e8 me surge la siguiente duda en relación a esta clase:

No está mal referido el ámbito léxico al que se refiere el profesor?

Según el artículo, el ámbito léxico se refiere a las variables que han sido definidas en su contexto de llamada. En este caso, a mi parecer, el ámbito léxico lo encuentras en el global scope debido a que “myCount()” es llamada en ese scope. Creo que es un concepto que no aplica al ejemplo que explica en la clase.

Puede que el profesor haya querido decir esto que expongo pero no lo entendí así. Creo que falta mucho más detalle en cómo funciona cada paso que toma JavaScript para hacer funcionar los closures.

4 respuestas
para escribir tu comentario
    Andrea Lozano Cataño

    Andrea Lozano Cataño

    studenthace 5 años

    Para leer el artículo en español solo hacemos clic derecho >> traducir en español.

    Héctor Eduardo López Carballo

    Héctor Eduardo López Carballo

    studenthace 5 años

    Escribí esto: Closures como "global scopes" chiquitos. Según yo explica por qué sí funciona lo que el profesor dice. . Básicamente cuando el profesor hace que el return de

    buildCount
    (
    return displayCount
    ) sea almacenado dentro de la variable
    myCount
    está guardando el ámbito léxico ahí. Efectivamente, la función displayCount podrá acceder a las variables del scope global, pero su "contexto de llamada" también es la función "buildCount" porque fue llamada en ese scope. . Espero poder explicarme. :S

    Robinson Matias Aguilar Bascuñan

    Robinson Matias Aguilar Bascuñan

    studenthace 5 años

    intentare explicarte lo mas detallado lo que sucede con este metodo para que puedas entenderlo mejor, seguiremos el mismo ejemplo de la clase, con el siguiente ejemplo.

    const reserveHotel(count){ let food=count const reserveFood = () => { console.log(food++) } return reserveFood } const packHotel = new reserveHotel() packHotel() packHotel()

    Bien. ahora antes de empesar, te explicare de que va el ejemplo.

    La idea es que se pueda hacer una reserva al hotel, que solo viene incluido 1 comida por reserva, sin embargo el hotel te da la factibilidad de poder comprar mas comida aparte una vez tengas reservada tu hotel. _________________________________--

    Bueno ahora te explicare de que va el codigo.

    El código de ejemplo. se compone de un clousure. que contiene una emulación de variable privada y un método publico que es intanseado para poder se llamado y ejecutado.

    para el que no le queda claro la definicion de cada concepto lo describiré levemente.

    • Clousure: una funcion dentro de otra funcion.

    • Variable privada: variable que solo puede ser llamada dentro de su ambito lexico.

    • Metodo publico:funcion que puede ser llamada desde cualquier parte siempre. sin embargo en esta ocacion se requiere de una instancia para poder llamarla


    Bien ahora te explicare realmente que sucede en el código.

    si te pones a analizar bien el código ves que hay una función llamada reserveHotel, esta función actuara como instanciadora. ¿porque?. porque al hacer..

    const packHotel =new reserveHotel(1) //instanciando con el valor 1

    estoy ejecutando la función reserveHotel() y esta me retornara algo. ¿pero que es?. bueno si nos fijamos linea a linea vemos que al principio hay una variable food y que esta esta tomando el valor que se esta pasando por parametro. es decir..

    count

    y nosotros le pasamos a count el valor 1 . Bueno después el código sigue ejecutándose y vemos que hay una función llamada reserveFood que dentro simplemente lo que hace es hacer un console.log(food++) imprimiento la cantidad de comidas +1 que vendría siendo la reserva que se le agrega por el llamado a esa función.

    Despues hay un retorno. ahh pero esta retornando una funcion y a la ves ejecutandola que es reserveFood().

    entonces hagamos un recuento hasta aqui. al instanciar reserveHotel(1) se almacena el valor 1 en la variable food y luego ejecuta la función reserveFood() que consolea food +1 una ves hace eso guarda esos valores como referencia en la función publica packHotel y terminando el ciclo.

    HASTA AQUí ES IMPORTANTE SABER QUE FOOD ACTUALMENTE NO VALE NADA. EL VALOR 1 COLOCADO CUANDO SE INSTANCIÓ. LO ÚNICO QUE HACE ES DECIR QUE CADA VES QUE SE LLAME A LA FUNCION packHotel() que en realidad no es mas que la función reserveFood() guardada en la constante packHotel. UTILIZARA ESE VALOR 1 COMO REFERNCIA PARA IR AGREGANDORE EN CADA LLAMADA.

    Siguiendo ahora lo único que resta es la llamada a la funcion packHotel(), la cual en el ejemplo es llamada 2 veces. entonces al llamarla esta tomara el valor referenciado en la instancia que seria 1 por lo tanto en cada llamada se guardaría el valor y se va sumando.

    packHotel() //1 packHotel() // 2

    La clave de todo eso es en realidad la variable privada food. la cual solo pueden acceder a ella la funcion reserveFood(). y es que esta es instanciada y guardada con el valor pasado por parámetro que estará siempre en esa instancia.

    Ojala se haya entendido lo mas posible y te haya servido de algo. (hasta yo me enrede un poco mientras escribía. XD) cualquier cosa ya sea corrección o duda que tengas. no dudes en hacerla.

    Robinson Matias Aguilar Bascuñan

    Robinson Matias Aguilar Bascuñan

    studenthace 5 años

    Todavía no entiendo bien el ingles para poder leer el articulo que mostraste efectivamente y decirte si esta en lo correcto o no. Con respecto a tu verdadera, no se si se establece en como funcionan los clousures o el tema del ámbito léxico dentro de un clousure

Curso de Closures y Scope en JavaScript

Curso de Closures y Scope en JavaScript

Como desarrollador JavaScript debes comprender a la perfección los diferentes alcances que tienen tus variables cuando son declaradas. En este curso aprenderás todos los conceptos fundamentales de Scope global y local, cómo declarar variables con const, let y var. Con ejercicios prácticos domina el uso de Closures en tus desarrollos.

Curso de Closures y Scope en JavaScript
Curso de Closures y Scope en JavaScript

Curso de Closures y Scope en JavaScript

Como desarrollador JavaScript debes comprender a la perfección los diferentes alcances que tienen tus variables cuando son declaradas. En este curso aprenderás todos los conceptos fundamentales de Scope global y local, cómo declarar variables con const, let y var. Con ejercicios prácticos domina el uso de Closures en tus desarrollos.