Saltar a un capítulo clave
Comprender el hoisting de Javascript
La elevación de Javascript es un comportamiento predeterminado de JavaScript, en el que todas las declaraciones (ya sean variables o funciones) se mueven o "elevan" a la parte superior de su ámbito local o a la parte superior de su ámbito global durante la fase de compilación, antes de que se ejecute el código. Esto te permite llamar a funciones antes de que aparezcan en el código.
En términos más sencillos, cuando se declara una variable y no se inicializa, el compilador de JavaScript lo entiende como indefinido. Del mismo modo, cualquier función o variable puede utilizarse antes de ser declarada, ya que se elevan a la parte superior de su ámbito. Este fenómeno se denomina elevación.
Conceptos básicos de la elevación en Javascript
Un punto crítico que debes recordar es que sólo se elevan las declaraciones, no las inicializaciones. Esto significa que si se declara una variable o función y se inicializa después de utilizarla, el valor será indefinido.
Una variable puede declararse de tres formas en JavaScript. Éstas son
- var
- let
- const
Cada declaración tiene su comportamiento de elevación, que puede representarse en la tabla siguiente:
Declaración | Elevación |
var | Elevado |
let | No izado |
const | No elevada |
Al utilizar var, la variable se elevará a la parte superior de su ámbito y se inicializará con un valor indefinido. Pero con let y const, la variable está en una zona muerta temporal. Esto significa que no está inicializada y que cualquier referencia a ella provocará un error de referencia (ReferenceError), debido a que no está elevada. Para demostrarlo, puedes utilizar los siguientes códigos:
console.log(myVar); //undefined var myVar; console.log(myLet); //ReferenceError let myLet;
Cuando se trata de elevar funciones, las declaraciones de funciones se elevan completamente a la parte superior de su ámbito, a diferencia de las declaraciones de variables.
Considera el siguiente ejemplo
console.log(miFunción()); // '¡Hola, mundo!' function miFunción() { return '¡Hola, mundo!'; }
Aunque la función se llame antes que la declaración de función, devuelve "¡Hola, mundo! Esto se debe a que la declaración de la función se eleva a la parte superior del ámbito.
Descripción completa de la elevación en JavaScript
A pesar de que la elevación es un concepto complejo, es esencial para el contexto de ejecución de JavaScript y desempeña un papel importante en la producción de un código más limpio y legible. Al comprender el hoisting, te equipas con la capacidad de evitar trampas y errores comunes en la codificación.
Un mito popular que hay que disipar es que la elevación mueve físicamente tu código a la parte superior del archivo JavaScript. Esto no es cierto. Como ya hemos dicho, la elevación se produce en la fase de compilación, por lo que el compilador se limita a asignar espacio de memoria para las declaraciones de variables y funciones.
Por tanto, el orden físico de tu código no cambia, sólo cómo lo ve el intérprete de JavaScript.
El comportamiento del intérprete de JavaScript respecto a la elevación puede resumirse brevemente así
- Las declaraciones de variables y funciones se ponen en memoria durante la fase de compilación.
- Las declaraciones de variables pasan por defecto a indefinidas, pero mantienen su lugar y esperan a ser ejecutadas.
- Las funciones completas con sus cuerpos se levantan.
- Utilizar una variable antes de declararla provoca un ReferenceError.
Por tanto, cuando escribas código JavaScript, ten siempre en cuenta la elevación y su impacto en tus declaraciones e inicializaciones. Se recomienda declarar siempre las variables en la parte superior del ámbito.
Explorar las funciones y el hoisting en Javascript
Cuando trabajas con Javascript, es importante comprender cómo maneja el lenguaje tanto las funciones como las variables. Una de las características fascinantes de Javascript es su fenómeno de "elevación". A diferencia de otros lenguajes, Javascript tiende a comportarse de forma diferente cuando se trata de declaraciones de funciones y expresiones, en particular debido a este concepto de elevación.
Explicación de la elevación de funciones en Javascript
En Javascript, la teoría de la elevación se aplica tanto a las funciones como a las variables. El intérprete mueve las declaraciones a la parte superior del ámbito actual, lo que significa que puedes llamar a funciones antes de que estén definidas en el bloque de código. Sin embargo, esto puede resultar algo confuso si no entiendes cómo funciona. Por ello, es fundamental distinguir entre dos tipos de funciones en Javascript: las declaraciones de función y las expresiones de función.
Una declaración de función define una función sin necesidad de asignar variables. Tiene la forma
function miFunc () { //hacer algo }
Una expresión de función define una función como parte de una sintaxis de expresión mayor (normalmente asignación de variables). Por ejemplo
var miFunc = function() { //hacer algo };
Entonces, ¿cuál es la diferencia de elevación entre estas dos? Pues es significativa. Las declaraciones de función se elevan completamente, lo que significa que todo el bloque de función se traslada a la parte superior del ámbito. Por lo tanto, si tienes una declaración de función en tu código, puedes llamarla cuando quieras, independientemente de su ubicación en el código.
Una visión de la elevación de funciones en Javascript
Ahora bien, puedes pensar que como las declaraciones de función se mueven a la parte superior del ámbito, las expresiones de función deberían hacer lo mismo. Sin embargo, no es así. Cuando se utiliza una expresión de función, la elevación se produce, pero se limita sólo a la declaración de la variable, no a la asignación. Por lo tanto, si se invoca una expresión de función antes de la declaración, recibirás un error indicando que no es una función.
Considera este ejemplo
console.log(miFunción()); // miFunción no es una función var miFunción = function() { return '¡Hola, mundo!'; };
Pero, ¿por qué Javascript tiene este extraño comportamiento? Bueno, Javascript utiliza un intérprete de dos pasadas. El primer paso busca todas las declaraciones y las eleva a la parte superior de sus respectivos ámbitos. Durante esta fase, las inicializaciones no se elevan. En las expresiones de función, la función se asigna a una variable. La declaración (variable) se eleva, pero la asignación (función) no.
Aquí tienes algunos aspectos clave que debes recordar sobre la elevación y las funciones:
- Las declaraciones de funciones y las declaraciones de variables siempre se elevan.
- Las asignaciones e inicializaciones de variables no se elevan.
- Las expresiones de función resultan indefinidas cuando se invocan antes de ser evaluadas debido a la elevación.
Esta dicotomía garantiza un contexto de ejecución adecuado y mantiene la coherencia del lenguaje Javascript. Para evitar resultados inesperados, es aconsejable declarar e inicializar las variables al principio de tus scripts y llamar a las funciones después de su declaración o simplemente asignarlas a variables si deseas utilizarlas antes en tus scripts, asegurando la previsibilidad en el resultado de tu código.
Desentrañando la elevación de clases en Javascript
Como ya sabrás, Javascript introduce el comportamiento hoisting en relación con las declaraciones de funciones o variables. Aquí, te sumergirás en un concepto intrigante conocido como 'Class Hoisting'.
Análisis en profundidad de la elevación de clases en Javascript
En algunos lenguajes, las clases actúan de forma similar a las funciones o variables en el contexto de la elevación. Pero en Javascript, el escenario es algo diferente. El aspecto interesante de entender la "elevación de clases" en JavaScript es que, a diferencia de las variables y las declaraciones de funciones, las declaraciones de clases no se elevan. Si intentas acceder a tu clase antes de declararla, JavaScript arrojará un error.
Una clase es un tipo de función en JavaScript, pero definida con la palabra clave "clase". Una distinción importante que debes recordar es que las clases en Javascript tienen un ámbito de bloque como las variables 'let' y 'const'.
console.log(miClase); //Error de referencia clase miClase{};
Te darás cuenta de que esto se desvía del comportamiento de las funciones, donde puedes utilizar funciones antes de la declaración debido al comportamiento de elevación automática. Esta desviación se debe a la naturaleza de la palabra clave 'class'. Al igual que "let" y "const", las declaraciones de "clase" están delimitadas por bloques y, por tanto, no pueden elevarse a la parte superior del bloque que las contiene.
Sin embargo, las clases, al igual que las funciones, tienen una historia algo más detallada debido a la existencia de las "expresiones de clase", que reflejan la funcionalidad de las "expresiones de función" y las "declaraciones de función". Pero, a diferencia de las expresiones de función, las expresiones de clase no se elevan.
Una expresión de clase es otra forma de definir una clase en JavaScript. Las expresiones de clase pueden tener nombre o no. El valor de la propiedad name de una función se utiliza dentro de la clase para llamar a métodos estáticos.
var MyClass = class Klass { // los métodos van aquí }; console.log(Klass); //ReferenceError: Klass no está definida
La expresión de la clase aquí se llama 'Klass'. Sin embargo, el alcance de "Klass" sólo se limita al cuerpo de la clase, lo que respeta el principio de encapsulación de datos, según el cual los objetos ocultan sus propiedades y métodos.
Comprender la elevación de clases en el contexto de Javascript
Cuando se habla de elevación en JavaScript, entran en la discusión "var", "let", "const", declaraciones de funciones, expresiones de funciones y, ahora, clases. Es vital darse cuenta de cómo se comportan todos los elementos dentro de un ámbito mayor para evitar errores y mantener un código limpio y eficiente.
Al igual que "let" y "const", las definiciones de clase tienen un alcance de bloque. No se elevan a la parte superior de tu código. Intentar acceder a la clase antes de su declaración provocará un ReferenceError. Este error se produce porque las clases JavaScript, a diferencia de las funciones, no se inicializan con un espacio en memoria. Por tanto, no tienen valor hasta su evaluación durante la ejecución del script.
A continuación se muestra una demostración de la elevación de clases frente a la elevación de funciones:
console.log(miFunción()); // '¡Hola, mundo!' console.log(miClase); // ReferenceError - no se puede acceder a 'miClase' antes de la inicialización function miFunción() { return '¡Hola, mundo!'; } class miClase {};
Dadas sus características de elevación, las clases deben declararse al principio del bloque en el que se espera que se haga referencia a ellas. Aunque esto parezca restrictivo, recuerda que las buenas prácticas de codificación fomentan este tipo de estructura. Al colocar todas tus declaraciones en la parte superior de sus respectivos ámbitos, permites que tu código sea claro, mantenible y menos propenso a errores molestos.
El papel de la elevación de variables en Javascript
En Javascript, el término "elevación" se menciona a menudo con respecto al comportamiento de las variables. Se trata de un concepto clave que hay que entender al escribir código, ya que puede ser fácilmente una fuente de confusión para los programadores noveles e incluso para los experimentados. Para entender los matices de Javascript, tienes que ver en acción la elevación de variables.
Un acercamiento a las variables elevadas en Javascript
En un lenguaje de programación estándar, la idea es sencilla: declaras una variable y luego la utilizas. Pero Javascript lanza una pequeña bola curva llamada elevación. Básicamente, Javascript "eleva" todas las declaraciones de variables (no las inicializaciones) a la parte superior del ámbito actual, ya sea una función o un ámbito global.
Una declaración de variable es el momento en que se le dice a Javascript que existe una variable, utilizando "var", "let" o "const", a menudo junto con la asignación de un valor.
El aspecto sorprendente de la elevación de variables es que permite utilizar una variable antes de que esté técnicamente declarada en el código. Esto puede provocar comportamientos inesperados en tu programa si no lo prevés.
Por ejemplo, observa el código siguiente
console.log(x); // indefinido var x = 5; console.log(x); // 5
Aunque x se declara después de la primera sentencia console.log, no se produce un error porque la declaración (no la inicialización) se eleva a la parte superior del ámbito.
Sin embargo, es importante tener en cuenta que el mecanismo de elevación funciona de forma diferente para "var", "let" y "const":
- Las declaraciones "var" se elevan y se inicializan con un valor "indefinido".
- Las declaraciones 'let' y 'const' se elevan pero no se inicializan. Por tanto, hacer referencia a ellas antes de declararlas provoca un error de referencia (ReferenceError).
Por ejemplo
console.log(y); // ReferenceError: y no está definida let y = 5;
Aunque la elevación de variables en Javascript puede ser algo compleja, constituye la base para entender la elevación de funciones y clases, y es una característica fundamental del lenguaje.
El mecanismo de elevación de variables en Javascript
Para comprender más a fondo cómo procesa Javascript la elevación de variables, es necesario sumergirse en las fases de compilación y ejecución. Es fácil pensar que Javascript es un lenguaje puramente interpretado, pero se somete a un proceso de dos pasos: Compilación y Ejecución.
En la fase de Compilación
- Javascript escanea todo el código en busca de declaraciones de variables y funciones.
- Asigna memoria para las variables y funciones declaradas, creando una referencia a ellas en el contexto de ejecución de Javascript.
- A las variables de tipo 'var' se les asigna un valor por defecto de 'indefinido'. En cambio, las de tipo 'let' y 'const' permanecen sin inicializar.
- Esto es sólo para las declaraciones de variables, no para las inicializaciones.
En la fase de Ejecución:
- Ejecuta el código línea a línea de arriba abajo.
- Asigna valores a las variables y ejecuta las funciones a medida que las encuentra durante esta fase.
- Las variables 'let' y 'const' sólo están disponibles para su uso una vez ejecutada su línea de código, a diferencia de las variables de tipo 'var', que estaban disponibles desde el principio.
Así pues, el proceso en dos fases de Compilación y Ejecución en Javascript es lo que hace posible el levantamiento de variables.
Considera el siguiente ejemplo
console.log(z); // indefinido var z = 5; // inicialización de la variable console.log(z); // 5
Aunque hemos intentado registrar "z" antes de declararla, no se ha producido ningún error, sólo "indefinido". Este "indefinido" es la inicialización por defecto que recibe "var" debido a su elevación. Sólo durante la fase de ejecución, "z" recibe el valor "5".
El mecanismo de elevación es una característica fascinante de Javascript, aunque puede dar lugar a resultados desconcertantes si no se entiende bien. A través de la elevación de variables, puedes obtener una comprensión más clara de las fases de compilación y ejecución en Javascript.
Ilustraciones prácticas de la elevación en Javascript
En Javascript, el mecanismo de elevación puede crear algunos comportamientos aparentemente inusuales si no se comprende correctamente. Es una diferencia clave que distingue a Javascript de la mayoría de los demás lenguajes informáticos. Pero no temas, comprender este concepto es una ayuda definitiva para depurar y escribir código limpio.
Ejemplos de elevación: ¿Cómo se comporta Javascript?
Sumerjámonos en la comprensión del modo en que se comporta Javascript cuando se trata de declaraciones de variables y funciones. Una vez que lo veas en acción, el diseño anómalo del hoisting será mucho más comprensible.
En primer lugar, he aquí cómo trata la elevación a las variables declaradas como "var":
console.log(aVar); // indefinida var aVar = 5;
En este ejemplo, JavaScript eleva la declaración de la variable "var" a la parte superior del ámbito, aunque esté declarada después de la primera referencia a console.log. El resultado es "indefinido" en lugar de un error.
Observa ahora cómo difiere la elevación con las declaraciones "let" y "const":
console.log(aLet); // ReferenceError let aLet = 5;
A diferencia de 'var', 'let' y 'const' se elevan pero no se inicializan, por lo que intentar acceder a ellas antes de su línea de declaración arroja un ReferenceError (no indefinido).
Además de variar las variables, las expresiones y declaraciones de funciones también tienen comportamientos dignos de mención:
console.log(namedFunction()); // '¡Hola, mundo!' function namedFunction() { return '¡Hola, mundo!'; }
Las declaraciones de función, al igual que las variables 'var', se izan e inicializan. En consecuencia, puedes llamar a la función antes de declararla y no se producirá ningún error.
Por el contrario, las expresiones de función presentan un escenario diferente:
console.log(namedFunctionExpression()); // TypeError var namedFunctionExpression = function() { return '¡Hola, mundo!'; };
Las expresiones de función están sujetas a las mismas reglas de elevación que "var". La expresión de la función se eleva, pero el valor de la función no se inicializa hasta que Javascript llega a la línea en la que se asigna la función. Por tanto, si se intenta invocarlas antes de su asignación, se produce un error de tipo TypeError.
Estas ilustraciones subrayan cómo se comporta la elevación en diversos contextos dentro de Javascript. Ser consciente de estos comportamientos es vital para evitar posibles errores o resultados inesperados en tus scripts.
Descifrando el hoisting a través de ejemplos de Javascript
Varios ejemplos prácticos ayudan a aclarar los comportamientos específicos del hoisting en Javascript. Con estos ejemplos, comprenderás cómo maneja Javascript las declaraciones de variables y funciones durante la fase de compilación.
Considera la elevación de "var" dentro del ámbito de una función:
function hoistTest() { console.log(hoistVar); // undefined - No es un ReferenceError var hoistVar = "Estoy elevado"; console.log(hoistVar); // "Estoy elevado" } hoistTest();
Una variable "var", cuando se declara dentro de una función, obedece al ámbito de la función. Su declaración se eleva a la parte superior del ámbito de la función. Por lo tanto, el primer console.log da como resultado "indefinido", no un error. Pero, obviamente, la inicialización de la variable sólo se produce en su línea de código, por lo que el valor de la variable es accesible posteriormente.
Por el contrario, 'let' y 'const' tienen alcance de bloque:
if(true) { console.log(izadoLet); // ReferenceError let izadoLet = "Estoy izado"; }
Las declaraciones 'let' y 'const' permanecen inaccesibles hasta que Javascript llega a la línea donde se declaran. Intentar utilizarlas antes de su línea de declaración provoca un ReferenceError, aunque estén dentro de un bloque 'if' o de cualquier otro bloque.
Vigila los matices de elevación cuando tengas declaraciones de función y expresiones de función:
console.log(elevarFunción()); // "Estoy elevado" function elevarFunción() { return "Estoy elevado"; }
Las declaraciones de función están totalmente elevadas. Por tanto, puedes llamar a una función por encima de su declaración sin encontrarte con un error.
Pero ten cuidado con las expresiones de función con 'var':
console.log(hoistFunctionExpression()); // TypeError var hoistFunctionExpression = function() { return "Estoy elevado"; };
Una expresión de función tiene el mismo principio de elevación que "var": se eleva la declaración, no la inicialización. Por tanto, invocar la función antes de asignarla da lugar a un TypeError, no a un valor de retorno.
Estos ejemplos deberían proporcionarte una comprensión transparente de cómo funciona el hoisting en Javascript. La comprensión del concepto hace que sea más fácil predecir los resultados, depurar problemas y escribir prácticas de codificación más eficientes.
Javascript Hoisting - Puntos clave
- El Hoisting en Javascript se produce en la fase de compilación, cuando se asigna espacio de memoria para las declaraciones de variables y funciones.
- El Hoisting en Javascript afecta a la visión interpretativa del orden físico del código sin cambiar el orden real.
- El Hoisting se aplica tanto a las funciones como a las variables en Javascript, desplazando las declaraciones a la parte superior del ámbito actual. Esto permite llamar a funciones antes de que estén definidas en el bloque de código.
- En Javascript, las declaraciones de función se elevan por completo, por lo que se pueden llamar independientemente de su ubicación en el código. Sin embargo, las expresiones de función sólo se elevan hasta el punto de declaración de la variable, no hasta la asignación.
- Las declaraciones de variables en Javascript se elevan y se inicializan con "undefined" si se utiliza "var", mientras que las declaraciones "let" y "const" se elevan pero permanecen sin inicializar, lo que provoca un error de referencia (ReferenceError) si se accede a ellas antes de la declaración.
Aprende más rápido con las 15 tarjetas sobre Elevación en Javascript
Regístrate gratis para acceder a todas nuestras tarjetas.
Preguntas frecuentes sobre Elevación en Javascript
Acerca de StudySmarter
StudySmarter es una compañía de tecnología educativa reconocida a nivel mundial, que ofrece una plataforma de aprendizaje integral diseñada para estudiantes de todas las edades y niveles educativos. Nuestra plataforma proporciona apoyo en el aprendizaje para una amplia gama de asignaturas, incluidas las STEM, Ciencias Sociales e Idiomas, y también ayuda a los estudiantes a dominar con éxito diversos exámenes y pruebas en todo el mundo, como GCSE, A Level, SAT, ACT, Abitur y más. Ofrecemos una extensa biblioteca de materiales de aprendizaje, incluidas tarjetas didácticas interactivas, soluciones completas de libros de texto y explicaciones detalladas. La tecnología avanzada y las herramientas que proporcionamos ayudan a los estudiantes a crear sus propios materiales de aprendizaje. El contenido de StudySmarter no solo es verificado por expertos, sino que también se actualiza regularmente para garantizar su precisión y relevancia.
Aprende más