¿Por qué JavaScript eleva las variables?

94

¿Por qué JavaScript eleva las variables?

¿Cuál fue la razón fundamental de los diseñadores cuando decidieron implementar la elevación? ¿Hay otros lenguajes populares que hagan esto?

Proporcione enlaces relevantes a documentación y / o registros.

Xlaudio
fuente
7
Sospecho que en este punto es histórico, y dudo seriamente que fuera algo más que "facilidad de implementación" originalmente.
Dave Newton
4
Honestamente, pregúntele a Brendan Eich, parece ser bastante receptivo.
Felix Kling
22
¿Por qué esta pregunta no es constructiva?
Francisc
18
@Francisc bienvenido a Stack Overflow, donde todo lo que puede preguntar es mover un diven jQuery
Xlaudius
20
Ésta es una pregunta realmente importante. Debería haber sido permitido. No fue un cebo de fuego. La elevación es uno de los elementos centrales para comprender cómo funciona JavaScript, y el "por qué" es una pregunta legítima que se aborda en la mayoría de los libros de texto del lenguaje. NO ESTÁ BIEN que la gente de Stack Overflow pisotee CONSTANTEMENTE preguntas como esta.
Bearvarine

Respuestas:

55

Como explica Stoyan Stefanov en el libro "Patrones JavaScript", la elevación es el resultado de la implementación del intérprete JavaScript.

La interpretación del código JS se realizó en dos pasadas. Durante la primera pasada, el intérprete procesa declaraciones de función y variable.

El segundo paso es el paso de ejecución del código real. El intérprete procesa expresiones de función y variables no declaradas.

Por lo tanto, podemos utilizar el concepto de "elevación" para describir tal comportamiento.

lxverde
fuente
15
Personalmente, realmente no me gusta la palabra "elevación". Da la representación falsa de que las declaraciones de variables y funciones se elevan mágicamente a la parte superior del alcance actual, cuando en realidad, el intérprete de JS, como mencionó, escanea el código fuente en busca de enlaces y luego ejecuta el código.
contactmatt
Ahora entiendo por qué JS es el lenguaje más incomprendido, no vi esto en ningún tutorial. Y se confundió con izar (y flujo de intérprete).
Swapnil Patwa
17
Uh, esto realmente no explica la razón. Un intérprete de un solo paso (que no hubiera llevado a izar) habría sido mucho más simple, entonces, ¿por qué los diseñadores optaron por dos pases?
Bergi
1
Esto no explica por qué se izan las variables, específicamente. Las funciones tienen sentido, las variables no (en la mayoría de los casos); creo que es un error.
Josh M.
Josh M. Esto está tan ampliamente especificado, no creo que sea un "error" ... (aunque estoy de acuerdo en que esta respuesta no responde realmente al razonamiento)
Jonas Wilms
10

El creador de JS Brendan Eich dijo una vez (en Twitter) :

"Var izar fue por lo tanto [una] consecuencia involuntaria de la función de elevación, sin alcance de bloque, [y] JS como un trabajo urgente de 1995".

También explicó que ...

"función de elevación permite la descomposición del programa de arriba hacia abajo, 'dejar rec' gratis, llamar antes de declarar; var izar etiquetado."

Brendan Eich

¿Hay otros lenguajes populares que hagan esto?

No conozco otros lenguajes populares que eleven variables de la misma manera. Creo que incluso ActionScript, otra implementación de ECMAScript utilizada en el desarrollo de Flash, no implementó la elevación. Esto ha sido una fuente de confusión y frustración para los desarrolladores familiarizados con otros lenguajes que están aprendiendo JavaScript.

ACTUALIZACIÓN: A partir de los comentarios, Python tiene un comportamiento de elevación de variables similar .

gfullam
fuente
2
Dar un +1 ya que esta es la única respuesta que intenta abordar directamente la pregunta.
Damon
1
Gracias por esta respuesta. ¡Estoy totalmente de acuerdo con @Damon!
codingbryan
1
Otro lenguaje popular que tiene elevación variable es Python: stackoverflow.com/q/63337235/2326961
Maggyero
2

Esto se debe a que el intérprete de JavaScript interpreta el código en dos ciclos.

  1. Finalización / compilación de código:
  2. Ejecución de código:

En el 1er ciclo, todas las declaraciones de variables y funciones se llevan a la parte superior del alcance de la función en el que se está ejecutando. Esto ayuda a crear variableObjectsparaexecution context función incluso antes de su ejecución.

En la segunda fase, las asignaciones de valores, las declaraciones de código y las llamadas a funciones se llevan a cabo línea por línea de la manera esperada.

Tienes una lectura un poco más detallada aquí.

Se le dará una mejor imagen en todo alrededor de la conducta let, consty classlas declaraciones, también la precedencia se sigue entre variables y funciones.

Jaspreet Singh
fuente
1
¿Está insinuando que es una consecuencia de una elección de diseño? Si es así, debe indicarlo claramente en su respuesta. Pero al leer la respuesta de Brendan Eich, podría haber sido una característica deseada, depende de cómo interpretes la última oración. En resumen, todavía no sé por qué con certeza
Bombinosh