{"id":651,"date":"2024-07-30T19:46:13","date_gmt":"2024-07-30T17:46:13","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=651"},"modified":"2024-07-30T19:46:13","modified_gmt":"2024-07-30T17:46:13","slug":"008-funciones-en-javascript","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/03-tipos-de-datos-en-javascript\/008-funciones-en-javascript\/","title":{"rendered":"008. Funciones en Javascript"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Que son<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las <strong>funciones<\/strong> son <strong>bloques de c\u00f3digo autocontenido<\/strong>, lo que significa que tiene su propio c\u00f3digo independiente al <strong>scope<\/strong> o al <strong>\u00e1mbito global<\/strong>, que se define una sola vez y que se puede ejecutar en cualquier momento. Adem\u00e1s una <strong>funci\u00f3n<\/strong> puede o no recibir <strong>par\u00e1metros<\/strong> que son datos que recibe separados por coma, y puede devolver o no, dependiendo del caso, valores.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Las <strong>funciones<\/strong> son un tipo de dato muy especial, tambi\u00e9n se consideran <strong>objetos<\/strong>, y en el argot de las cuestiones \u00e9ticas de <strong>Javascript<\/strong>, se dice que son <strong>ciudadanos de primer orden<\/strong>, o de <strong>primera clase<\/strong>, lo que significa que son muy poderosas en <strong>Javascript<\/strong>, ya que las podemos asignar como valor, podemos retornar la ejecuci\u00f3n de una funci\u00f3n adicional, entonces, se pueden pasar como argumentos, pueden retornar como valores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Desde <strong>ES6<\/strong> tenemos caracter\u00edsticas muy interesantes, un caso de ellos son las <strong>funciones flecha<\/strong> o <strong>arrow function<\/strong>, que veremos m\u00e1s adelante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Declarar una funci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para declarar una <strong>funci\u00f3n<\/strong>, existen dos maneras de crear nuestras funciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Funciones declaradas<\/li>\n\n\n\n<li>Funciones expresadas<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hay una diferencia entre utilizar una manera u otra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funci\u00f3n declarada<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para trabajar con una <strong>funci\u00f3n declarada<\/strong> utilizamos la palabra reservada <strong><em>function<\/em><\/strong>, de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &lt;script&gt;\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Funci\u00f3n declarada\n&nbsp; &nbsp; &nbsp; &nbsp; function estoEsUnaFuncion () {\n&nbsp; &nbsp; &nbsp; &nbsp; }\n  &nbsp; &lt;\/script&gt;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C\u00f3mo dec\u00edamos, una <strong>funci\u00f3n<\/strong> es un bloque de l\u00edneas de c\u00f3digo que se ejecutan al un\u00edsono.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &lt;script&gt;\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Funci\u00f3n declarada\n&nbsp; &nbsp; &nbsp; &nbsp; function estoEsUnaFuncion () {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Uno\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Dos\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Tres\");\n&nbsp; &nbsp; &nbsp; &nbsp; }\n&nbsp; &nbsp; &lt;\/script&gt;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez tenemos declarada la <strong>funci\u00f3n<\/strong>, lo que tenemos que hacer es mandarla llamar, esto se conoce como <strong>invocar una funci\u00f3n<\/strong>, y se hace de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Invocaci\u00f3n de funci\u00f3n\n&nbsp; &nbsp; &nbsp; &nbsp; estoEsUnaFuncion();<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para <strong>invocarla<\/strong>, adem\u00e1s del nombre tenemos que ponerle los <strong>par\u00e9ntesis<\/strong>. Los <strong>par\u00e9ntesis<\/strong> indican, en un <strong>lenguaje de programaci\u00f3n<\/strong>, que una funci\u00f3n se va a ejecutar. Por lo tanto, en el momento que invocamos a la <strong>funci\u00f3n<\/strong> de nuestro ejm, \u00e9sta se ejecuta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funci\u00f3n que devuelve valores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a declarar una <strong>funci\u00f3n<\/strong> que va a devolver valores. Para ello se ha de hacer uso de una palabra reservada denominada <strong><em>return<\/em><\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Declarar funci\u00f3n que devuelve valores\n&nbsp; &nbsp; &nbsp; &nbsp; function unaFuncionQueDevuelveValores () {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Uno\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Dos\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return \"La funci\u00f3n ha retornado una cadena de texto\";\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n        \/\/ Guardo la funci\u00f3n en una variable para poder imprimirla en consola\n&nbsp; &nbsp; &nbsp; &nbsp; let valorDeFuncion = unaFuncionQueDevuelveValores();\n&nbsp; &nbsp; &nbsp; &nbsp; console.log(valorDeFuncion);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La variable que hemos creado que es igual a la funci\u00f3n retornar\u00e1 el valor de <strong><em>return<\/em><\/strong>. Cuando una <strong>funci\u00f3n<\/strong>, dentro del cuerpo de la <strong>funci\u00f3n<\/strong>, el compilador de la <strong>funci\u00f3n<\/strong> encuentra la palabra reservada <strong><em>return<\/em><\/strong>, en ese momento, ignora todas las l\u00edneas de c\u00f3digo que est\u00e1n abajo, retorna ese valor como valor de la <strong>funci\u00f3n<\/strong>, y todo lo que est\u00e1 antes del <strong><em>return<\/em> <\/strong>se ejecuta, pero lo que est\u00e1 despu\u00e9s ya no se ejecuta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A lo largo de los scripts que realicemos, habr\u00e1 <strong>funciones<\/strong> que retornar\u00e1n un valor, que podr\u00e1 ser una <strong>cadena de texto<\/strong>, un <strong>n\u00famero<\/strong>, <strong>objeto<\/strong>, <strong>array<\/strong>, la misma <strong>funci\u00f3n<\/strong>, pero va a haber veces que nuestras <strong>funciones<\/strong> no van a tener que retornar valores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funci\u00f3n que recibe par\u00e1metros y devuelve valores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello vamos a crear una <strong>funci\u00f3n<\/strong>, de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Declarar funci\u00f3n que reciba par\u00e1metros y devuelva valores\n&nbsp; &nbsp; &nbsp; &nbsp; function saludar(nombre, edad) {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(`Hola, mi nombre es ${nombre} y tengo ${edad} a\u00f1os`);\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Invocar a funci\u00f3n pas\u00e1ndole los par\u00e1metros\n&nbsp; &nbsp; &nbsp; &nbsp; saludar(\"Francisco\", 51);\n        saludar();<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La primera <strong>invocaci\u00f3n<\/strong> nos devolver\u00e1 los valores que hemos pasado por par\u00e1metros, pero la segunda invocaci\u00f3n devolver\u00e1 <strong><em>undefined<\/em> <\/strong>como valor, ya que no le hemos pasado los valores que la funci\u00f3n pide. Antes en <strong>ES6<\/strong> no se pod\u00edan asignar valores a los <strong>par\u00e1metros<\/strong> directamente, pero desde <strong>ES6<\/strong> ya se pueden asignar valores a los par\u00e1metros que pasamos a la funci\u00f3n, quedando la sintaxis de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">  &nbsp; &nbsp; &nbsp; \/\/ Declarar funci\u00f3n que reciba par\u00e1metros y devuelva valores\n&nbsp; &nbsp; &nbsp; &nbsp; function saludar(nombre = \"Francisco\", edad = 51) {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(`Hola, mi nombre es ${nombre} y tengo ${edad} a\u00f1os`);\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Invocar a funci\u00f3n pas\u00e1ndole los par\u00e1metros y sin pasarle par\u00e1metros\n&nbsp; &nbsp; &nbsp; &nbsp; saludar(\"Luis\", 49);\n&nbsp; &nbsp; &nbsp; &nbsp; saludar();<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En la segunda <strong>invocaci\u00f3n<\/strong>, donde no le estamos asignando valores a los <strong>par\u00e1metros<\/strong>, devuelve los valores por defecto que hemos asignado a dichos par\u00e1metros.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones declaradas VS funciones expresadas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En las <strong>funciones declaradas<\/strong>, se puede invocar a la <strong>funci\u00f3n<\/strong> antes de declararla, funcionar\u00eda perfectamente. Esto es debido al <strong>Hoisting<\/strong>, cuando declaramos una <strong>funci\u00f3n<\/strong>, <strong>Javascript<\/strong> directamente la sube al principio, despu\u00e9s de las variables declaradas, con lo cual es como si se hubiera declarado ya, hace lo que se denomina un <strong>hoisting de la funci\u00f3n<\/strong>, lo primero que ordena <strong>Javascript<\/strong> son <strong>variables,&nbsp;<\/strong>despu\u00e9s <strong>funciones<\/strong>, por lo que, din\u00e1micamente lo que hace <strong>Javascript<\/strong> es elevar (<strong>Hoisting<\/strong>), es por ello que, aunque invoquemos (llamemos) a la <strong>funci\u00f3n<\/strong> antes de declararla, va a funciones sin problema en las <strong>funciones declaradas<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existe otra manera de declarar <strong>funciones<\/strong>, y es declararlas como si fueran <strong>expresiones<\/strong>, lo que se hace es crear la <strong>funci\u00f3n<\/strong> y asignarla din\u00e1micamente a una <strong>variable<\/strong>, con en el siguiente ejm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Funciones expresadas\n&nbsp; &nbsp; &nbsp; &nbsp; const funcionExpresada = function() {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Esto es una funci\u00f3n expresada\");\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; funcionExpresada();<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso ya no tenemos que darle nombre a la <strong>funci\u00f3n<\/strong>, porque dicho nombre se lo hemos puesto a la <strong>variable<\/strong>. Este es un patr\u00f3n muy utilizado dentro de las <strong>funciones<\/strong> en <strong>Javascript<\/strong>, y esto se conoce con el nombre de <strong>funci\u00f3n an\u00f3nima<\/strong>, es decir, una funci\u00f3n que no tiene nombre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Buenas pr\u00e1cticas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ambas opciones son v\u00e1lidas. Si somos ordenados y declaramos primero nuestras <strong>variables<\/strong> y despu\u00e9s nuestras <strong>funciones<\/strong>, no hay problema en crear <strong>funciones declaradas<\/strong>. Pero en los \u00faltimos a\u00f1os se est\u00e1 utilizando mas la <strong>funci\u00f3n expresada<\/strong>, la cual nos evita cometer errores de compilaci\u00f3n por tener mal acomodado nuestro c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejm completo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os dejamos la sintaxis de un ejm completo de funciones declaradas y expresadas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"es\"&gt;\n&lt;head&gt;\n&nbsp; &nbsp; &lt;meta charset=\"UTF-8\"&gt;\n&nbsp; &nbsp; &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n&nbsp; &nbsp; &lt;title&gt;Funciones en Javascript&lt;\/title&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n&nbsp; &nbsp; &lt;h1&gt;Funciones en Javascript&lt;\/h1&gt;\n\n&nbsp; &nbsp; &lt;script&gt;\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Declaraci\u00f3n de funci\u00f3n\n&nbsp; &nbsp; &nbsp; &nbsp; function estoEsUnaFuncion () {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Uno\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Dos\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Tres\");\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Invocaci\u00f3n de funci\u00f3n\n&nbsp; &nbsp; &nbsp; &nbsp; estoEsUnaFuncion();\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Declarar funci\u00f3n que devuelve valores\n&nbsp; &nbsp; &nbsp; &nbsp; function unaFuncionQueDevuelveValores () {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Uno\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Dos\");\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return \"La funci\u00f3n ha retornado una cadena de texto\";\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; let valorDeFuncion = unaFuncionQueDevuelveValores();\n&nbsp; &nbsp; &nbsp; &nbsp; console.log(valorDeFuncion);\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Declarar funci\u00f3n que reciba par\u00e1metros y devuelva valores\n&nbsp; &nbsp; &nbsp; &nbsp; function saludar(nombre = \"Francisco\", edad = 51) {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(`Hola, mi nombre es ${nombre} y tengo ${edad} a\u00f1os`);\n&nbsp; &nbsp; &nbsp; &nbsp; }\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Invocar a funci\u00f3n pas\u00e1ndole los par\u00e1metros y sin pasarle par\u00e1metros\n&nbsp; &nbsp; &nbsp; &nbsp; saludar(\"Pepito\", 49);\n&nbsp; &nbsp; &nbsp; &nbsp; saludar();\n\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Funciones expresadas\n&nbsp; &nbsp; &nbsp; &nbsp; const funcionExpresada = function() {\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(\"Esto es una funci\u00f3n expresada\");\n&nbsp; &nbsp; &nbsp; &nbsp; }\n&nbsp; &nbsp; &nbsp; &nbsp; funcionExpresada();\n&nbsp; &nbsp; &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Que son Las funciones son bloques de c\u00f3digo autocontenido, lo que significa que tiene su propio c\u00f3digo independiente al scope o al&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":628,"menu_order":7,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-651","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"Que son Las funciones son bloques de c\u00f3digo autocontenido, lo que significa que tiene su propio c\u00f3digo independiente al scope o al...","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=651"}],"version-history":[{"count":1,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/651\/revisions"}],"predecessor-version":[{"id":652,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/651\/revisions\/652"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/628"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}