Autor Tema: Closures JavaScript, qué son y para qué sirven (concepto). Ejercicio CU01169E  (Leído 2576 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola, dejo la solución a un nuevo ejercicio.

Citar
EJERCICIO
Analiza el siguiente código y responde a las siguientes preguntas:

Código: [Seleccionar]
<!DOCTYPE html>
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style type="text/css">
body { font-family: Helvetica, Arial, sans-serif;}
h2 {  font-size: 1.5em;} h3 { font-size: 1.2em;}
div div {color:blue; margin:10px;}
</style>
<script type="text/javascript">
function cambiarDimensionFuente(size) {   return function() { document.body.style.fontSize = size + 'px';};
}
var size8 = cambiarDimensionFuente(8);
var size16 = cambiarDimensionFuente(16);
var size24 = cambiarDimensionFuente(24);
 
function setClicks(){
document.getElementById('fuente-8').onclick = size8;
document.getElementById('fuente-16').onclick = size16;
document.getElementById('fuente-24').onclick = size24;
}
</script></head>
<body onload="setClicks()">
<div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2><h3>Ejemplos JavaScript</h3>
<div id ="fuente-8" > Poner texto a 8 </div> <div id ="fuente-16" > Poner texto a 16 </div>
<div id ="fuente-24" > Poner texto a 24 </div> </div>
<p>En las praderas de la estepa de la Tierra del Fuego suele hacer frío</p>
</body></html>

Citar
a) ¿En qué parte del código se genera un closure o cerradura? ¿Por qué?
En las tres lineas que hay dentro de la función 'setClicks()'. Por que desde dentro de la función 'setClicks()' estamos usando variables definidas con ámbito global.

Citar
b) ¿En qué parte del código se establece que al hacer click sobre el elemento con id fuente-8 se cambie el tamaño de las fuentes de la página?
Dentro de la función setClicks().

Citar
c) Supón que eliminamos la función setClicks y dejamos su código “libre” dentro de las etiquetas <script> … </script>. ¿Qué mensaje de error te muestra la consola de depuración? (Activa la consola si no la tienes activada) ¿Por qué aparece ese mensaje de error?
'TypeError: document.getElementById(...) is null'. Haciendo referencia a la linea 19.
Porque cuando el interpreté lee la dicha linea, todavía no se ha cargado el elemento div con id='fuente-8' al que hace referencia.

Citar
d) ¿Debemos escribir document.getElementById('fuente-8').onclick = size8; ó document.getElementById('fuente-8').onclick = size8(); ?¿Por qué?
Si lo escribimos de esta manera 'document.getElementById.('fuente-8').onclick=size8();', se tomaría size8() como una función y se ejecutaría nada más cargar la página. Sin necesidad de hacer click sobre el texto. Es decir, el tamaño de letra pasaría a ser 8px.

Citar
e) Supón que al cargar la página queremos que el tamaño inicial de fuente sea 8 y para ello nos valemos de la función setClicks. ¿Debemos escribir dentro de esta función size8; ó size8();? ¿Por qué?
size8();
Porque de esa manera usamos size8 como una función, si pusiésemos solo size8; no pasaría nada.

Citar
f) Las closures no siempre son necesarias, incluso a veces se generan involuntariamente o innecesariamente consumiendo recursos del sistema que podrían ahorrarse. ¿Qué ventajas le ves al uso de closures en este código? ¿Y qué inconvenientes?


Citar
g) Reescribe el código (hazlo como mejor creas cambiando todo aquello que consideres necesario) de forma que obtengamos el mismo resultado pero sin hacer uso de closures.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style type="text/css">
body { font-family: Helvetica, Arial, sans-serif;}
h2 {  font-size: 1.5em;} h3 { font-size: 1.2em;}
div div {color:blue; margin:10px;}
</style>
<script type="text/javascript">
function cambiarDimensionFuente(size) {
document.body.style.fontSize = size + 'px';
}
</script>
</head>
<body>
<div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2><h3>Ejemplos JavaScript</h3>
<div id ="fuente-8" onclick="cambiarDimensionFuente(8)"> Poner texto a 8 </div>
<div id ="fuente-16" onclick="cambiarDimensionFuente(16)"> Poner texto a 16 </div>
<div id ="fuente-24" onclick="cambiarDimensionFuente(24)">  Poner texto a 24 </div>
</div>
<p>En las praderas de la estepa de la Tierra del Fuego suele hacer frío</p>
</body>
</html>
« Última modificación: 07 de Diciembre 2015, 11:38 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas Pedro

En la a) Desde mi punto de vista el closure está en

Código: [Seleccionar]
function cambiarDimensionFuente(size) {   return function() { document.body.style.fontSize = size + 'px';}; }

Citar
A las funciones internas que hacen uso de variables locales de las funciones externas dentro de las cuales se encuentran las denominamos cerraduras o closures.

En cambiarDimensionFuente se hace uso en una función interna de size, que es un parámetro para la función externa.

En setClicks no veo closure porque setClicks hace uso de size8, size16 y size24 que son variables glogales (referencias a función).

La b) bien

La c) bien

La d) bien al escribir document.getElementById('fuente-8').onclick = size8; establecemos una función a ejecutar como respuesta a un evento.

La e) bien size8() implica ejecución de la función

La f) en este caso no le veo ventajas al uso de closures y el inconveniente que consume más recursos

La g) bien. También se puede resolver así:

Código: [Seleccionar]
<!DOCTYPE html>
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style type="text/css">
body { font-family: Helvetica, Arial, sans-serif;}
h2 {  font-size: 1.5em;} h3 { font-size: 1.2em;}
div div {color:blue; margin:10px;}
</style>
<script type="text/javascript">
function cambiarDimensionFuente(size) { document.body.style.fontSize = size + 'px';}

var size8 = function() {cambiarDimensionFuente(8);}
var size16 = function () {cambiarDimensionFuente(16);}
var size24 = function () {cambiarDimensionFuente(24);}
 
function setClicks(){
document.getElementById('fuente-8').onclick = size8;
document.getElementById('fuente-16').onclick = size16;
document.getElementById('fuente-24').onclick = size24;
}
</script></head>
<body onload="setClicks()">
<div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2><h3>Ejemplos JavaScript</h3>
<div id ="fuente-8" > Poner texto a 8 </div> <div id ="fuente-16" > Poner texto a 16 </div>
<div id ="fuente-24" > Poner texto a 24 </div> </div>
<p>En las praderas de la estepa de la Tierra del Fuego suele hacer frío</p>
</body></html>

Salu2

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola. Evidentemente no había entendido bien el concepto de closure. He vuelto a leer el tema y junto con tus aclaraciones me quedó bastante claro.

Gracias por todo.

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".