Autor Tema: Ejemplo bind en JavaScript ligar parámetros a funciones crear copias CU01178E  (Leído 3666 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas a todos los compañeros de aprenderaprogramar.com. A continuación dejo una posible solución del ejercicio CU01178E del curso JavaScript desde cero.

Citar
EJERCICIO

Escribe este código, ejecútalo y responde a las preguntas que aparecen a continuación.

Código: [Seleccionar]
function conversor(toUnit, factor, offset, input) {

    offset = offset || 0;

    return [((offset+input)*factor).toFixed(2), toUnit].join(" ");

}

 

var milesToKm = conversor.bind(undefined, 'km', 1.60936, 0);

var poundsToKg = conversor.bind(undefined, 'kg', 0.45460, 0);

var farenheitToCelsius = conversor.bind(undefined, 'gradosC',0.5556, -32);

 

alert(milesToKm(10));           

alert(poundsToKg(2.5));         

alert(farenheitToCelsius(98));

Citar
a) ¿Cuántas funciones ligadas (copias parametrizadas) de la función conversor se crean en este código?

Se crean tres funciones ligadas que son: var milesToKm, var poundsToKg y var farenheitToCelsius.

Citar
b) ¿Qué es lo que devuelve la función conversor?

La función conversor devuelve el resultado de la conversación de unas mediadas a otras.

Citar
c) ¿Qué objeto actúa como this en la función milesToKm?

Como en dicha función el this está declarado como 'undefined' el objeto que actúa como this es el objeto global de JavaScript, es decir, el objeto Window.

Citar
d) ¿Qué tarea cumple y con qué fórmula trabaja la función milesToKm?

La tarea de la función milesToKm es convertir millas en kilómetros. La fórmula con la que trabaja la función es: el parámetro offset más las unidades de la medida que se convertirá por el factor de las unidades de la medida conversora.
(offset+input)*factor.

Citar
e) ¿Qué tarea cumple y con qué fórmula trabaja la función poundsToKg?

La tarea de la función milesToKm es convertir pounds en kilógramos. La fórmula con la que trabaja la función es: el parámetro offset más las unidades de la medida que se convertirá por el factor de las unidades de la medida conversora.
(offset+input)*factor

Citar
f) ¿Qué resultado devuelve milesToKm(10) y qué significa este resultado?

Devuelve: 16.09 km. Es decir que 10 millas equivales a 16.09 km.

Citar
g) ¿Qué resultado devuelve poundsToKg(2.5) y qué significa este resultado?

Devuelve: 1.14 kg. Quiere decir que 2.5 pounds equivales a 1.14 kg.

Citar
h) ¿Qué resultado devuelve farenheitToCelsius(98) y qué significa este resultado?

Devuelve: 36.67 gradosC. Quiere decir que 98 grados fahrenheit equivalen a 36.67 gradosC.

Citar
i) ¿Qué significado tiene la expresión offset = offset || 0;?

Quiere decir que el parámetro offset equivaldra al parámetro offset que se le ha pasado en la función y en su defecto valdrá 0.

Citar
j) ¿Cuál es la finalidad del uso de toFixed(2)?

Devuelve un String con el número o variable sobre el que se invoca el método con tantos decimales como indique el parámetro n (toFixed(n)).

Respues extraida de la entrega: CU01156E del curso JavaScript desde cero.

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=837:convertir-string-a-number-javascript-redondear-tofixed-isnan-toprecision-parseint-parsefloat-cu01156e-&catid=78:tutorial-basico-programador-web-javascript-desde-&Itemid=206

Citar
k) ¿Por qué crees que se usa el parámetro offset en la función conversor?

Para que haya una expresión arimética y no nos salga el mensaje: NaN.

Citar
l) Modifica el código para ampliar la información que se nos muestra: introduce un parámetro fromUnit en la función conversor de modo que el resultado nos informe del dato de origen, sus unidades, y el dato convertido y sus unidades.

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

function conversor(toUnit, factor, offset, input, fromUnit){
offset = offset || 0;
return [input+' '+fromUnit+' equivalen a: '+((offset+input)*factor).toFixed(2), toUnit].join(' ');
}

var milesToKm = conversor.bind(undefined, 'km', 1.60936, 0);
var poundsToKg = conversor.bind(undefined, 'kg', 0.45460, 0);
var farenheitToCelsius = conversor.bind(undefined, 'gradosC', 0.5556, -32);

alert(milesToKm(10, 'miles'));
alert(poundsToKg(2.5, 'pounds'));
alert(farenheitToCelsius(98, 'farenheit'));

</script>
</head>
<body>

</body>
</html>

Mi duda sale aquí, por qué cuando paso el parámetro como un parámetro en la función ligada, no funciona? A caso las funciones ligadas tienen un límite de pasarle los parámetros? Por ejemplo, el siguiente código no funciona correctamente y no entiendo por qué:

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

function conversor(toUnit, factor, offset, input, fromUnit){
offset = offset || 0;
return [input+' '+fromUnit+' equivalen a: '+((offset+input)*factor).toFixed(2), toUnit].join(' ');
}

var milesToKm = conversor.bind(undefined, 'km', 1.60936, 0, 'miles');
var poundsToKg = conversor.bind(undefined, 'kg', 0.45460, 0, 'pounds');
var farenheitToCelsius = conversor.bind(undefined, 'gradosC', 0.5556, -32, 'farenheit');

alert(milesToKm(10));
alert(poundsToKg(2.5));
alert(farenheitToCelsius(98));

</script>
</head>
<body>

</body>
</html>

Gracias.
« Última modificación: 24 de Abril 2016, 11:24 por Mario R. Rancel »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:CU01178E bind en JavaScript
« Respuesta #1 en: 22 de Abril 2016, 13:22 »
Perdonad.

Misterio resuelto. Estaba pasando en mal orden los parámetros. Si queremos pasar los parámetros en las funcioens ligadas, lo tendrémos que hacer así:

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

function conversor(toUnit, factor, offset, fromUnit, input){
offset = offset || 0;
return [input+' '+fromUnit+' equivalen a: '+((offset+input)*factor).toFixed(2), toUnit].join(' ');
}

var milesToKm = conversor.bind(undefined, 'km', 1.60936, 0, 'miles');
var poundsToKg = conversor.bind(undefined, 'kg', 0.45460, 0, 'pounds');
var farenheitToCelsius = conversor.bind(undefined, 'gradosC', 0.5556, -32, 'farenheit');

alert(milesToKm(10));
alert(poundsToKg(2.5));
alert(farenheitToCelsius(98));

</script>
</head>
<body>

</body>
</html>

Gracias.

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:CU01178E bind en JavaScript
« Respuesta #2 en: 24 de Abril 2016, 11:07 »
Hola dimiste.

a, bien
b, bien
c, bien
d, bien, la formula para pasar de millas a kilómetros es (valorEnKilometros=valorEnMillas*1.60936).
e, bien, la formula para pasar de pounds a kilogramos es (valorEnKilogramos=valorEnPounds*0.45460).
f, bien
g, bien
h, bien
i, bien, si offset no recibiese ningún valor, su valor por defecto sería 0.
j, bien
k, si quitásemos el parámetro offset el script seguiría funcionando, no nos daría como resultado NaN, si es verdad que por ejemplo la función ligada farenheitToCelsius no haría bien el cálculo,porque le faltaría un dato necesario para la buena conversión,  pero no daría error. offset es sólo un parámetro más que por ejemplo la función ligada farenheitToCelsius si usa.
l, el código está bien resuelto, solo preguntarte si entiendes bien la siguiente línea:

Código: [Seleccionar]
return [input+' '+fromUnit+' equivalen a: '+((offset+input)*factor).toFixed(2), toUnit].join(' ');
saludos ;D

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola, poco que añadir a lo comentado por Pedro. En la pregunta k) una respuesta que se podria dar es la siguiente. Algunas conversiones son lineales y simplemente suponen multiplicar por un valor, por ejemplo millas a kilómetros. Sin embargo otras conversiones no son lineaeles, como el paso de grados farenheit a grados centígrados cuya fórmula es GradosC = (GradosF - 32) * 5/9

Aquí además del factor multiplicador (5/9) interviene un factor de desplazamiento (offset) de la entrada, en este caso -32. Para poder usar una misma función como "base" tanto para funciones lineales como con desplazamiento, se introduce el parámetro offset, dejándolo a cero cuando no es necesario su uso. Como te ha comentado Pedro, no está relacionado con la aparición de NaN.

Saludos

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes,

y gracias tanto a Pedro como a Mario por vuestro tiempo y corregirme el ejercicio.

Es un poquito complejo para mi entender las cuestiones matemáticas dado que antes de empezar a dedicarme a programación mi campo de estudios ha sido totalmente diferente, pero con vuestras explicaciones se me acalaran las cosas (poco a poco, jeje).

Tiens razón, Pedro, no entedía muy bien lo que devolvía la función conversor, puesto que no habíamos visto hasta ahora en el curso la impresión de variables con comas. Hasta hoy siempre concatenabamos con el signo '+' y nunca con ','. Creo que se nota, porque he puesto la concatenación de la nueva variable con '+'.

Tampoco sé que función cumple el método '.join'. No lo busqué en Internet porque pensé que en futuras entregas se explicará.

Gracias y saludos :)

Además, tampoco entiendo porque lo que devuelve la función conversor está puesto como un array, es decir, entre: [].

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola dimiste.

La forma que usa el ejemplo es un poco enrevesada, porque como dices tu, para concatenar los parámetros hay formas más fáciles.

En este caso lo que hacemo es que colocamos dentro de un array todos los parámetros, y con el método join(' ') decimos que se devuelva un string con los valores de los elementos del array separados por espacios en blanco.

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