Autor Tema: JavaScript ReferenceError: is not defined hoisting elevación variables CU01190E  (Leído 2521 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes. Mediante la presente hago entrega de una posible solución del ejercicio CU01190E del curso JavaScript desde cero.

Citar
EJERCICIO

Dado este fragmento de código. Revísalo y responde a las siguientes preguntas:

Código: [Seleccionar]
<!DOCTYPE html>

<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">

<script type="text/javascript">

var x = 'Hola amigos'; // variable global

function ejemplo(){

 alert( x ); // esperamos el valor global

 var x;

 x = 'Saludos desde Costa Rica'; // redefinimos la variable en contexto local

 alert( x );  // esperamos el nuevo valor local

}

</script></head>

<body><div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2><h3>Ejemplos JavaScript</h3></div>

<div style="color:blue;" id ="pulsador" onclick="ejemplo()"> Probar </div>
</body></html>

Citar
a) Realiza una prueba pulsando en “Probar”. ¿Qué resultados obtienes? ¿Cómo se explican esos resultados?

En este código tenemos dos varialbes con el mismo nombre, pero una es de ámbito global y la otra de ámbito local. Cuando ejecutamos una función, la misma primero busca las variables de ámbito más cercano a ella, es decir, de ámbito local y posteriormente de ámbito global.
En la primera vez la variable "x" nos aparece como undefined, en la segunda ya podemos saber su valor.  Porque el intérprete sólo iza la definición de la variable, pero no su inicialización. Por eso cuando intentamos ver la variable sin inicializarla obtenemos una variable undefined (no nos muestra el valor de la variable global, porque existe una variable local con el mismo nombre, pero no está inicializada, sólo está difinida). Luego, sí se inicializa y podemos obtener su valor.

Citar
b) Cambia el código y declara la variable x dentro de la función al mismo tiempo que la inicializas. ¿Qué resultados obtienes? ¿Cómo se explican esos resultados?

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">
        var x = "Hola amigos"; // variable global

function ejemplo(){
alert(x); //esperamos el valor global
var x = 'Saludos desde Costa Rica'; //redefinimos la variable en contexto local
alert(x); //esperamos el nuevo valor local
}

</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;" onclick="ejemplo()">Probar</div>
</body>
</html>

El resultado es el mismo, a la primera vez cuando intentamos saber el valor de la variable "x" la misma no está inicializada. La elevación se ha hecho sólo a nivel de definición, pero no de inicialización.

Citar
c) De los dos casos anteriores ( a y b ). ¿En cuáles se produce hoisting: en el a), en el b) ó en ambos?

En ambos casos. Tenemos un alert con la variable "x" antes de tu línea de definición, por lo tanto, el intérprete hace una elevación(hoisting) de la variable "x".

Citar
d) En este caso, ¿el hoisting está afectando a los resultados obtenidos? ¿Por qué? ¿Cuáles serían los resultados de ejecutar estos códigos si no existiera hoisting?

Sí que afecta, porque si no existiera se produciría un error y el script no funcionaría. Es como si no existiera la variable hasta que no sea definida. Sería lo mismo como escirbir en el código esto:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

var x = "Hola amigmos"; //variable global

function ejemplo(){
alert(hola);
alert(x); //esperamos el valor global
var x = 'Saludos desde Costa Rica'; //redefinimos la variable en contexto local
alert(x); //esperamos el nuevo valor local
}

</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;" onclick="ejemplo()">Probar</div>
</body>
</html>

Aquí la variable "hola" ni siquiera está definida. Es lo mismo como si no existiera el hoisting, nos daría un error: "ReferenceError: hola is not defined" y el código no se ejecutaría.

Gracias.
« Última modificación: 03 de Mayo 2016, 09:46 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días todo correcto. En el apartado b) es curioso ver cómo es elevada sólo la declaración de la variable, pero no su inicialización o asignación de valor aún estando en una misma línea. Lo que podríamos considerar "más lógico" es que toda la línea fuera elevada pero vemos que no ocurre así.

Saludos.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, Mario.

Gracias por corregirme el ejercicio y por tu tiempo dedicado.

Es verdad, a veces el intérprete "hace" cosas de los que no nos damos cuenta o incluso las desconocemos. Por eso es recomendable  el estudio del comportamiento del intérprete y sus características si queremos evitarnos quebraduras de cabeza.

Saludos:)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".