Las funciones son la parte más importante de la programación funcional (especialmente en JavaScript). Las funciones son la única fuente que ayuda a los desarrolladores a realizar una programación funcional. Generalmente abreviado como FP, que gira en torno a las funciones y es la forma en que usamos las funciones lo que hace que nuestro código sea funcional. Sin función, no hay FP. Entonces surge la pregunta ¿qué es exactamente una función?
En términos simples, una función es una colección de código que se puede ejecutar varias veces. La mayoría de nosotros confundimos una función con un procedimiento. Pero son entidades separadas.
PROCEDIMIENTO |
FUNCIÓN |
Un procedimiento puede o no recibir entrada. | Una función siempre toma entrada (en FP). |
Un procedimiento puede o no devolver salida. | Una función siempre devuelve la salida. |
En la programación funcional, debemos usar funciones tanto como sea posible.
Entrada: En programación general, usamos indistintamente argumentos con parámetros pero no son los mismos. Los argumentos son datos que pasamos a través de llamadas a funciones y los parámetros son datos que recibimos en una definición de función.
En JavaScript, no es necesario que el número de argumentos sea siempre el mismo que el de los parámetros. Si pasamos menos argumentos, los parámetros restantes quedarán sin definir como un valor en la función y si pasamos más argumentos que los parámetros declarados, los argumentos restantes permanecerán intactos.
Podemos obtener todos los argumentos sin siquiera definir un solo parámetro, usando argumentos como un objeto similar a una array , pero no es una buena práctica.
¿Sabes que cada función tiene una propiedad interna llamada argumentos ? ¿Alguna vez has notado por qué se llama argumentos y no parámetros ?
Nota: un argumento es un objeto similar a una array al que podemos acceder dentro de una función. Contiene propiedades que se pasan a una función. Dado que estamos hablando de las propiedades que se pasan a la función, no de las propiedades que reciben propiedades como parámetros.
- Un argumento es un objeto similar a una array. Podemos acceder a los valores con un índice de array, pero no podemos usar métodos de array como forEach, map, reduce , etc., ya que es similar a una array pero no una array.
- Un objetoargumento contiene valores de los argumentos pasados a esa función (así que se llama argumentos). En el siguiente programa, podemos ver la salida de los argumentos. Imprime todos los valores que pasamos como argumentos.
Javascript
function print(a, b) { console.log(a); console.log(b); console.log(arguments); console.log(arguments[0]); console.log(arguments[1]); } print(1, 2, 3, 4);
Producción:
Nota: a partir de ES5, el uso de argumentos no se considera una buena práctica. Debes evitar usarlo. Pero si usa argumentos, el objeto está limitado a la propiedad de longitud .
En la programación funcional, cuidamos estrictamente la cantidad de parámetros en una declaración de función que se conoce como aridad . Tenemos que cuidar la aridad porque a veces tenemos que pasar una función dentro de otra función y entonces tenemos que pensar en términos de compatibilidad.
Javascript
// The arity of maipulateJSON is 2. we can find // arity with length property of a function function manipulateJSON(json, options) { console.log(json, options) } console.log( manipulateJSON.length )
Producción:
2
La función con aridad 1 se conoce como función unaria . Del mismo modo, la función con aridad 2 se conoce como binaria, y con más de 2, la aridad se conoce como función n-aria .
Podría haber un problema con la función de longitud . Digamos que si hay un parámetro predeterminado o un parámetro de descanso, ese parámetro no se incluye en la longitud.
Javascript
function printDefault(fn, args = {}) { fn(args); } function printRest(fn, ...args) { fn(...args); } printDefault(console.log, { name: "Praveen" }); printRest(console.log, 1, 2, 3, 4); console.log(printDefault.length); console.log(printRest.length);
Producción:
Nota: En JavaScript, la función siempre devuelve la salida ya sea externamente (por el motor JS) o internamente (por el desarrollador).
Javascript
function print1( name ) { console.log( name ); } function print2( name ) { console.log( name ); return; } function print3( name ) { console.log( name ); return undefined; } console.log( print1("Praveen") ); console.log( print2("Praveen") ); console.log( print3("Praveen") );
Producción:
Nota: Se recomienda devolver un valor de una función en la programación funcional. En caso de que desee devolver varios valores, puede usar una array o un objeto.
Sabes que en JavaScript, la palabra clave de retorno no solo usa una función para devolver valores, sino que también se puede usar en la declaración de control de flujo. Eso significa que podemos detener la ejecución de una función en cualquier lugar o en cualquier parte de la ejecución de una función. Podría haber un caso en el que puede haber múltiples declaraciones de retorno en una función. Pero simplemente confunde al desarrollador para descubrir cómo funciona la función. Es solo que no es una buena práctica usar múltiples retornos en una función.
La función puede devolver valor(es) Como todos sabemos, la función puede devolver valor(es). Puede ser una array primitiva o podría ser un objeto.
Nota: ¿Prefiere el punto y coma (;) al escribir JavaScript? Si es SÍ , entonces es genial, pero si es NO , amigo mío, deberías hacerlo. Sé que debería ser una preferencia del desarrollador, pero en JavaScript se recomienda usar punto y coma. JavaScript utiliza la inserción automática de punto y coma (ASI) . Si no está insertando un punto y coma, ASI entra en acción y podría haber una repercusión. Podría haber algunos errores graves.
Debe estar esperando que IdentityObject devuelva un objeto, pero en su lugar, devolverá undefined .
El motor de JavaScript es lo suficientemente inteligente y sabe dónde insertar el punto y coma. Pero por qué depender del motor.
Una función puede devolver otra función.
Si una función que devuelve o recibe uno o más valores de función, esa función se conoce como una función de orden superior .
Javascript
const arr = [1, 2, 3, 4, 5, 6]; arr.forEach(function printArrayValues(val) { console.log(val); });
Producción:
En el programa anterior, arr es una array y estamos usando el método forEach para imprimir todos los valores. forEach () es una función de orden superior y espera una función como parámetro.
Estamos utilizando funciones de orden superior en la vida cotidiana y FP no es una excepción. FP usa un orden superior en cada lugar. Ahora es el momento de introducir el cierre.
El cierre se trata de recordar las variables de alcance incluso después de que el alcance haya cambiado. No podemos hacer FP sin el cierre y el cierre se trata de devolver una función de otra función y recordar el alcance. Discutiremos el cierre en otro artículo.
ES6 Función de flecha: Todos hemos oído hablar de la función de flecha. Como tiene una sintaxis más corta y sin palabra clave de función .
Javascript
const numbers = [1, 2, 3, 4, 5, 6]; const newNumbers = numbers.map(function (x) { return x * 2; }); console.log(newNumbers); const arrowNewNumbers = numbers.map((x) => x * 2); console.log(arrowNewNumbers);
Producción:
La mayoría de los usuarios prefieren la función de flecha, pero no recomiendo usarla. A continuación se presentan las razones
- La depuración no es fácil con la función de flecha, porque la función de flecha es una función anónima y, en cualquier caso, obtenemos algún error y depuramos nuestra aplicación, entonces en la pila de funciones no obtendremos el nombre de la función.
- Siempre tenemos que cuidar la sintaxis de la función de flecha que se describe a continuación.
Reglas de la función de flecha:
- Podemos soltar la palabra clave function .
- Podemos eliminar la palabra clave de retorno si hay una sola declaración en la función de flecha.
- Tenemos que usar la palabra clave return si queremos devolver un objeto.
Javascript
const numbers = [1, 2, 3, 4, 5, 6]; // We can drop function and return keyword const version1 = numbers.map((x) => x * 2); // If there is single parameter thern we // can also drop parenthesis const version2 = numbers.map(x => x * 2); // If we have to return an object then we // have to use curly braces with return // keyword because compiler gets easily // confused with a block. // const version3 = (arr) => { array: arr } // ERROR const version3 = function (arr) { return { array: arr, }; }; console.log(version1); console.log(version2); console.log(version3(numbers));