Javascript: Funciones. Orden superior
Una función se define en javascript mediante la palabra clave function seguida del nombre de la función y de los argumentos de esta entre paréntesis y separados por comas.
function nombre (argumentos) {
cuerpo de la funcion
}
Para devolver el valor de retorno de la función se utiliza la palabra clave return. Como vemos no difiere mucho de las funciones de otros lenguajes de programación.
function multiplica (x, y) {
return x * y;
}
Una vez que la función ha sido definida puede llamarse desde cualquier punto del programa pasándole los argumentos correspondientes:
//miVar toma como valor el producto de 3 por 2, 6
var miVar = multiplica(3,2);
//ahora miVar vale 60
miVar = multiplica(miVar,10);
Nada perturbador de momento. Veamos ahora las características funcionales de javascript. Para ello vamos a usar una construcción típica en los lenguajes funcionales como es la función recursiva map. map recorre una matriz aplicando una función a cada uno de los elementos de la matriz.
function map (funcion,matriz) {
if (matriz.length==0)
return matriz;
else {
return new Array().concat(car = funcion(matriz.shift())).concat(map(funcion,matriz));
}
}
function cuadrado (x) {
return x * x;
}
var miArray = new Array(1,2,3,4,5,6);
/*map devolvera una matriz cuyos elementos son el cuadrado de los elementos de miArray*/
var resultado = map(cuadrado,miArray);
Este programa hace uso de las funciones de orden superior para recorrer una lista de valores y aplicar la función cuadrado a cada uno de los valores. El funcionamiento en si de map no nos importa demasiado ahora mismo, no tiene que ver con el lenguaje, pero lo explicaré de todas formas para que se vea mas claramente.
La función recursiva map funciona tomando en cada paso el primer elemento de la matriz y aplicando la función que nos pasan como argumento a ese elemento. Después se toma el nuevo elemento en la cabecera de la matriz, que ahora será el que era segundo elemento antes, volviendo quitar este del array y a aplicar la función sobre este. El proceso se repite hasta que el array este vacio, momento en que se vuelve atras en la recursión y se va añadiendo a la izquierda los elementos que se transformaron con la función pasada como argumento.
Ahora bien, lo que de verdad nos interesa de este ejemplo es que le estamos pasando una función como argumento a map. Las funciones son valores normales, que pueden ser pasados como argumentos o ser el valor de retorno de una función y que pueden ser también guardados en variables. Veamos un ejemplo mas sencillo que ilustre esto.
function componer (f, g, x) {
return f(g(x));
}
Este es un ejemplo bastante tonto y sin utilidad pero ya hemos visto con map las posibilidades que nos dan las funciones de orden superior.
Veamos ahora como un ejemplo en el que devolvemos una función:
function operar (operacion) {
switch (operacion){
case "rep":
return reponer;
case "ven":
return vender;
}
}
function reponer (cantidad) {
dinero = dinero - (cantidad * 5);
unidades = unidades + cantidad;
}
function vender (cantidad) {
dinero = dinero + (cantidad * 10);
unidades = unidades - cantidad;
}
var dinero = 1000;
var unidades = 100;
//Ahora tenemos 990 euros y 102 unidades
operar("rep")(2);
//y despues de vender 50, 1490 euros y 52 unidades
operar("ven")(50);
Si llamamos a la función operar con "rep" como argumento nos devuelve la función reponer, de forma que operar("rep")(2) es equivalente a llamar directamente a reponer(2) e igualmente al pasar como argumento "ven", se nos devuelve la función vender, con lo que operar("ven")(50) es equivalente a vender(50).
<< Home