Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

156
Views
En Javascript, ¿puede un cierre compartir el alcance con un valor de retorno de función?

Estoy tratando de entender este código inexplicable de Eloquent Javascript :

 function trackKeys(keys) { let down = Object.create(null); function track(event) { if (keys.includes(event.key)) { down[event.key] = event.type == "keydown"; event.preventDefault(); } } window.addEventListener("keydown", track); window.addEventListener("keyup", track); return down; } var arrowKeys = trackKeys(["ArrowLeft", "ArrowRight", "ArrowUp"]);

Creo que entiendo cómo la track función interna mantendrá una referencia hacia down y las keys porque es un cierre, pero estoy perdido al return down;

¿Ese valor de retorno será una referencia a exactamente lo mismo down están accediendo las devoluciones de llamada? No entiendo; Pensé que solo se podía acceder a las variables locales mediante funciones internas.

Seguimiento: ¿qué pasaría si down fuera un tipo de datos primitivo y no un objeto, seguiría funcionando?

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

La función inicializa la variable down como un objeto.

Entonces, dentro de la función, down es una variable que apunta a un objeto determinado.

Cuando la función regresa down , devuelve una referencia al objeto, lo que significa que el objeto se vuelve accesible a través del retorno de la función.

Si down fuera primitivo, esto no funcionaría ya que la función solo devolvería un valor primitivo en lugar de una referencia a un objeto.

about 4 years ago · Juan Pablo Isaza Report

0

TLDR: Decir "se devuelve una variable" es ambiguo debido a la imprecisión inherente del lenguaje humano. No significa que se devuelva el emparejamiento de variables de identificador y valor. Significa que se devuelve el valor de la variable. En este caso se devuelve el valor de la referencia al objeto (creado por Object.create(null) ).

¿Ese valor de retorno será una referencia a exactamente lo mismo down están accediendo las devoluciones de llamada?

Sí.

Pensé que solo se podía acceder a las variables locales mediante funciones internas.

Una variable es un emparejamiento de un identificador (es decir, el nombre de la variable) y un valor.

El alcance es la región de código sobre la cual un identificador (en este caso " down ") tiene un significado específico.

El alcance de un identificador está determinado por la forma en que se declara la variable ( const / let / var /implicit en modo no estricto). La variable down se declara usando let ; por lo tanto, su alcance es el bloque contenedor más cercano, que es la función trackKeys .

Las funciones declaradas dentro trackKeys se cerrarán down través del mecanismo integrado de formación de cierre de JavaScript y, por lo tanto, compartirán el significado del identificador "abajo".

Nota: si las funciones internas o los bloques también declaran su propia variable llamada "down" estas variables internas darán como resultado un error ( var en un bloque que no es de función en modo estricto, declaración duplicada), no haga nada ( var en modo no estricto en un bloque que no es de función), o sombrear (ocultar de la vista) la variable externa ( let / const ).

Regresar down no cambia el alcance del identificador down . Tratar de hacer referencia a "abajo" fuera trackKeys continuará dando error o devolverá undefined dependiendo de si está en modo estricto. Sin embargo, devolver el valor de down hace que este valor esté disponible fuera trackKeys .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!