<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Angel Taborda</title>
    <description>The latest articles on DEV Community by Angel Taborda (@figox).</description>
    <link>https://dev.to/figox</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461504%2Fd9c9c9e2-c64e-41fc-ab76-c3610060f998.jpeg</url>
      <title>DEV Community: Angel Taborda</title>
      <link>https://dev.to/figox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/figox"/>
    <language>en</language>
    <item>
      <title>Crea y publica tu blog GRATIS en 10 min con Astro y Netlify</title>
      <dc:creator>Angel Taborda</dc:creator>
      <pubDate>Sun, 29 Aug 2021 20:32:44 +0000</pubDate>
      <link>https://dev.to/figox/crea-y-publica-tu-blog-gratis-en-10-min-con-astro-y-netlify-122</link>
      <guid>https://dev.to/figox/crea-y-publica-tu-blog-gratis-en-10-min-con-astro-y-netlify-122</guid>
      <description>&lt;p&gt;Sin duda, la mejor manera de documentar lo que hacemos y aprendemos es mediante un &lt;strong&gt;Blog.&lt;/strong&gt; Puede parecer tedioso el tener que redactar un artículo, pero es una valiosa herramienta de respaldo y consolidación de nuestros conocimientos.&lt;/p&gt;

&lt;p&gt;Si alguna vez te ha pasado por la mente empezar tu propio blog, hazlo!. No solo ayudarás a otros sino también a ti mismo. &lt;/p&gt;

&lt;p&gt;Al tener que pensar y estructurar tus ideas para plasmarlas en un artículo, llegarás a entender mejor lo que quieres explicar y tendrás una base de conocimientos propia a la cual acudir cuando lo necesites.&lt;/p&gt;

&lt;p&gt;Plataformas para hospedar tu blog hay muchas!, yo por ejemplo uso &lt;strong&gt;&lt;a href="https://dev.to/figox"&gt;DEV.to&lt;/a&gt;&lt;/strong&gt; para el mío. Pero si eres desarrollador, lo más común es que quieras picártelo tu mismo 🤣 y en este artículo te mostraré cómo hacerlo con &lt;strong&gt;&lt;a href="https://astro.build/"&gt;Astro&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt; es una herramienta para construir sitios web estáticos usando tu framework de &lt;strong&gt;JavaScript&lt;/strong&gt; favorito &lt;em&gt;(React, Vue, Svelte, etc.)&lt;/em&gt; pero enviando al navegador sólo HTML y tu código JavaScript solo cuando sea necesario. Esto hará que tu sitio sea increíblemente rápido!. 🚀 Te recomiendo que lo mires con más detalle en su sitio web. &lt;/p&gt;

&lt;p&gt;En lo que nos centraremos ahora es en crear y desplegar nuestro blog siguiendo unos pocos pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crear el proyecto&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subir repositorio&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desplegar blog&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publicar nuevo artículo&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Y qué mejor manera de hacerlo que usando al chico nuevo del barrio (Astro). Así que vamos manos a la obra:&lt;/p&gt;

&lt;h3&gt;
  
  
  Crear el proyecto
&lt;/h3&gt;

&lt;p&gt;Lo primero que vamos a hacer es crear la carpeta del proyecto, yo la llamaré &lt;strong&gt;my-astro-blog&lt;/strong&gt;. Luego inicializaremos el proyecto usando la plantilla &lt;strong&gt;Blog.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir my-astro-blog
cd my-astro-blog
npm init astro
❯  Blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego instalaremos las dependencias, inicializaremos el repositorio de &lt;strong&gt;git&lt;/strong&gt; y por último lanzaremos el proyecto para ver qué tenemos como resultado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install 
git init &amp;amp;&amp;amp; git add -A &amp;amp;&amp;amp; git commit -m "Initial commit" 
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al navegar a &lt;strong&gt;&lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt;&lt;/strong&gt; deberíamos ver algo como esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6lJEvtqq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6o2id4rwmlz6w1215m4q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6lJEvtqq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6o2id4rwmlz6w1215m4q.gif" alt="Demo localhost" width="720" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya tenemos nuestro blog! Ahora vamos a publicarlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subir repositorio
&lt;/h3&gt;

&lt;p&gt;En mi caso, subiré este repositorio local a uno remoto en &lt;strong&gt;Gitlab.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DYIz9XNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2w58z646tqqkb74aoned.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DYIz9XNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2w58z646tqqkb74aoned.jpg" alt="Gitlab repo" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para subirlo simplemente tengo que hacer lo siguiente desde la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote add origin git@gitlab.com:io-digital-repos/my-astro-blog.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora que ya tengo mi proyecto en &lt;strong&gt;Gitlab&lt;/strong&gt;, lo publicare usando &lt;strong&gt;Netlify.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Desplegar blog
&lt;/h3&gt;

&lt;p&gt;Usaré &lt;strong&gt;&lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;&lt;/strong&gt; para hospedar mi blog, así que tengo que irme a &lt;strong&gt;"Sites =&amp;gt; New Site from Git"&lt;/strong&gt;, seguir los pasos en el wizard y esperar que termine la compilación.&lt;/p&gt;

&lt;p&gt;Cuando termine se generará una URL con la que podemos acceder a nuestro nuevo blog, en mi caso la URL que auto-generó fue esta: &lt;strong&gt;&lt;a href="https://awesome-varahamihira-a33564.netlify.app"&gt;https://awesome-varahamihira-a33564.netlify.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; para asociar tu propio dominio simplemente debes ir a la sección "Domain" del sitio y seguir los pasos indicados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Publicar nuevo artículo
&lt;/h3&gt;

&lt;p&gt;Lo que nos falta es ver cómo publicamos nuevos post en nuestro blog. Para ello vamos a abrir nuestro proyecto de Astro con nuestro editor de código favorito, en mi caso es &lt;strong&gt;Visual Studio Code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como vemos nuestro proyecto contiene archivos &lt;strong&gt;.astro&lt;/strong&gt;, los cuales no son reconocidos por VSC. Pero no pasa nada, esto lo solucionamos buscando la &lt;strong&gt;extensión "Astro"&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w6BYHdTr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3c418bmm63rg10cc5n2z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w6BYHdTr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3c418bmm63rg10cc5n2z.jpg" alt="Extensión Astro" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez instalada todo se verá mejor 😋 pero no quiero entrar en los detalles de la programación con &lt;strong&gt;Astro&lt;/strong&gt;, puedes encontrar toda la documentación &lt;a href="https://docs.astro.build/es/getting-started"&gt;aquí&lt;/a&gt; y leerla tranquilamente.&lt;/p&gt;

&lt;p&gt;Ahora mismo centraremos la atención en la carpeta &lt;strong&gt;"pages/posts"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vsjDBYFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64q29id7cd7ohut55lyz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vsjDBYFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64q29id7cd7ohut55lyz.jpg" alt="Carpeta pages/posts" width="389" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esa carpeta es donde crearemos los nuevos artículos de nuestro blog usando &lt;strong&gt;Markdown&lt;/strong&gt; 👍 un formato muy conocido y querido por muchos 😃&lt;/p&gt;

&lt;p&gt;Crearé una nueva entrada llamada &lt;strong&gt;hello-world.md&lt;/strong&gt; y subiré los cambios a mi repositorio. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZrSzptqu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9c2vnoys4qmxp7bhpnec.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZrSzptqu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9c2vnoys4qmxp7bhpnec.jpg" alt="Hello World MD" width="391" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto disparará automáticamente la compilación en &lt;strong&gt;Netlify&lt;/strong&gt; y si accedo nuevamente a la URL de mi blog, podré ver mi nuevo post publicado, recién salido del horno. 🥖&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Y ahora qué?
&lt;/h3&gt;

&lt;p&gt;Ahora solo es cuestión de personalizar tu blog para darle tu estilo personal y de crear tus propios artículos. &lt;/p&gt;

&lt;p&gt;¡A por ello!&lt;/p&gt;

&lt;h3&gt;
  
  
  Fuentes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.astro.build/getting-started"&gt;Getting Started 🚀 Astro Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>astro</category>
      <category>netlify</category>
    </item>
    <item>
      <title>Automatización Cognitiva con UiPath y Azure</title>
      <dc:creator>Angel Taborda</dc:creator>
      <pubDate>Sun, 29 Aug 2021 20:11:16 +0000</pubDate>
      <link>https://dev.to/figox/automatizacion-cognitiva-con-uipath-y-azure-25pl</link>
      <guid>https://dev.to/figox/automatizacion-cognitiva-con-uipath-y-azure-25pl</guid>
      <description>&lt;h2&gt;
  
  
  Pongámonos en contexto
&lt;/h2&gt;

&lt;p&gt;En los últimos años venimos escuchando mucho sobre &lt;strong&gt;RPA&lt;/strong&gt;, aunque es cierto que existía desde hace mucho tiempo atrás, la aparición de nuevas herramientas que permiten interactuar con todo tipo de aplicaciones de manera más sencilla fue lo que llevó a esta tecnología a un siguiente nivel y a considerarla cómo una tecnología en sí, hasta el punto de ser parte importante en la transformación digital.&lt;/p&gt;

&lt;p&gt;Desde entonces muchas tareas rutinarias han podido ser automatizadas y se ha podido ver el gran beneficio de la implementación de esta tecnología en industrias y empresas de todos los tamaños y tipos, ahorrando significativamente los costos y empleando el tiempo de los recursos de manera que aporten más valor a la compañía. &lt;/p&gt;

&lt;p&gt;Sin embargo rápidamente notamos ciertas limitaciones a la hora de automatizar nuestros procesos. Una de estas limitaciones es la posibilidad de interpretar de manera fácil y correcta documentos con datos &lt;strong&gt;desestructurados.&lt;/strong&gt; Esta limitación conllevaba a que, al intentar superar esta barrera, nuestros procesos se volvieran más complejos y muy poco estables.&lt;/p&gt;

&lt;p&gt;Es entonces cuando empezamos a ver aparecer el término automatización cognitiva o &lt;strong&gt;RCA&lt;/strong&gt; &lt;em&gt;(Robotic Cognitive Automation).&lt;/em&gt; Esta nueva clase de automatización de procesos combina el &lt;strong&gt;RPA&lt;/strong&gt;, donde tenemos reglas bien definidas que realizan tareas simples, con la &lt;strong&gt;inteligencia artificial.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este nuevo tipo de automatización se ha hecho posible gracias a proveedores como &lt;strong&gt;Microsoft&lt;/strong&gt; quienes nos ofrecen una plataforma con la que podemos integrarnos de manera muy sencilla con toda clase de &lt;strong&gt;servicios cognitivos&lt;/strong&gt;, por ejemplo tenemos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Servicios de decisión
&lt;/h3&gt;

&lt;p&gt;Con estos podemos realizar identificación temprana de posibles anomalías, detectar contenido potencialmente ofensivo o no deseado, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Servicios de lenguaje
&lt;/h3&gt;

&lt;p&gt;El mas común es el &lt;strong&gt;NLP&lt;/strong&gt; &lt;em&gt;(Natural Language Processing)&lt;/em&gt; que incorpora reconocimiento del lenguaje natural, análisis de texto que detecta opiniones, frases claves y entidades con nombres, o hasta detectar y traducir a más de 90 idiomas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Servicios de visión por computadora
&lt;/h3&gt;

&lt;p&gt;Con ellos podemos analizar contenido de imágenes y vídeos, detectar e identificar personas en imágenes o extraer textos y tablas de documentos. &lt;/p&gt;

&lt;p&gt;Y es en este último tipo de servicio en el que nos centraremos hoy y haremos un ejemplo práctico de cómo integrar &lt;strong&gt;UiPath con Microsoft Azure&lt;/strong&gt; utilizando el servicio de visión por computadora para extraer información de facturas sin haber hecho ningún entrenamiento previo ni haber indicado de alguna manera dónde está la información que queremos extraer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manos a la obra
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/C0IzbEoKO3g"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;Como hemos visto, si queremos llevar nuestras automatizaciones a un siguiente nivel, la automatización cognitiva es prácticamente necesaria porque de esta manera dotamos cada vez más a nuestros robots de más autonomía, lo cual permite a los usuarios enfocarse en tareas aún más necesarias para la compañía y seguir aportando valor a la misma. &lt;/p&gt;

&lt;p&gt;Además gracias a grandes proveedores de servicios tecnológicos como &lt;strong&gt;Microsoft&lt;/strong&gt; contamos con los &lt;strong&gt;Servicios Cognitivos de Azure&lt;/strong&gt; para integrarlos en nuestros &lt;strong&gt;RPA&lt;/strong&gt; de manera muy sencilla.&lt;/p&gt;

&lt;p&gt;Por último no olvidemos que gracias a la economía de escala estos servicios están al alcance de todos los bolsillos, lo que nos impulsa a usarlos cada vez más. Por eso podríamos decir que quién no lo usa es porque no quiere…La pregunta es, &lt;strong&gt;¿Lo estás haciendo ya?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rpa</category>
      <category>azure</category>
      <category>uipath</category>
    </item>
    <item>
      <title>JavaScript Tips &amp; Tricks #1 (undefined)</title>
      <dc:creator>Angel Taborda</dc:creator>
      <pubDate>Sun, 29 Aug 2021 20:04:41 +0000</pubDate>
      <link>https://dev.to/figox/javascript-tips-tricks-1-undefined-553k</link>
      <guid>https://dev.to/figox/javascript-tips-tricks-1-undefined-553k</guid>
      <description>&lt;h2&gt;
  
  
  undefined
&lt;/h2&gt;

&lt;p&gt;En JavaScript existen &lt;strong&gt;7&lt;/strong&gt; tipos &lt;em&gt;built-in&lt;/em&gt;, a saber:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;null&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;undefined&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;boolean&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;number&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;object&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;symbol&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora mismo nos centraremos en &lt;em&gt;undefined.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Comencemos por comentar una mala idea xD... Desafortunadamente, a diferencia del tipo &lt;em&gt;null&lt;/em&gt; por ejemplo, &lt;em&gt;undefined&lt;/em&gt; resulta ser un identificador. ¿Qué quiere decir esto?, pues que podemos hacer locuras como esta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    var undefined = 2;
    console.log(undefined); // 2
}

foo();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Esto no podríamos hacerlo por ejemplo con &lt;em&gt;null&lt;/em&gt;, ya que es una palabra reservada y no puede ser tratada como una variable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operador void
&lt;/h3&gt;

&lt;p&gt;Mientras que undefined es un identificador &lt;em&gt;built-in&lt;/em&gt; que contiene el valor undefined por defecto, otra manera de obtener este valor es con el operador &lt;strong&gt;void&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La expresión &lt;em&gt;void&lt;/em&gt; __ , "vacía" cualquier valor, de manera que el resultado de la expresión es siempre el valor undefined. Esta expresión &lt;strong&gt;no modifica el valor existente&lt;/strong&gt; solo asegura que ningún valor sea retornado de la expresión.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var a = 42;

console.log( void a, a ); // undefined 42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por convención, la manera más común de representar el valor &lt;em&gt;undefined&lt;/em&gt; es usando la expresión &lt;strong&gt;void 0&lt;/strong&gt;. Cabe destacar que no hay diferencia práctica entre &lt;strong&gt;void 0, void 1 o undefined.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;undefined&lt;/strong&gt; es un identificador que contiene el valor undefined.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El operador &lt;strong&gt;void&lt;/strong&gt; es otra manera de obtener el valor undefined y la manera más usada de obtenerlo es usando la expresión &lt;strong&gt;void 0.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fuentes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://books.google.es/books?id=NOFwBgAAQBAJ&amp;amp;lpg=PP1&amp;amp;dq=types%20%26%20grammar&amp;amp;pg=PP1#v=onepage&amp;amp;q=types%20&amp;amp;%20grammar&amp;amp;f=false"&gt;You Don't Know JS: Types &amp;amp; Grammar&lt;/a&gt; &lt;em&gt;escrito por Kyle Simpson&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>¿Qué es this?</title>
      <dc:creator>Angel Taborda</dc:creator>
      <pubDate>Sun, 29 Aug 2021 17:25:36 +0000</pubDate>
      <link>https://dev.to/figox/que-es-this-239p</link>
      <guid>https://dev.to/figox/que-es-this-239p</guid>
      <description>&lt;p&gt;Seguramente no es la primera vez que ves esta pregunta. Quizás te la han hecho en alguna entrevista de trabajo o en un curso de JavaScript.&lt;/p&gt;

&lt;p&gt;Lo cierto es que pocos saben lo que realmente es &lt;em&gt;this&lt;/em&gt; en JavaScript. La razón más común es por el concepto que tenemos de esa palabra en lenguajes como C#, y que nos hace pensar erróneamente que debe referirse a lo mismo.&lt;/p&gt;

&lt;p&gt;Normalmente hasta que no nos topamos con un funcionamiento “extraño” en nuestro código, no nos detenemos a pensar en si sabemos lo que realmente es. De hecho lo primero que hacemos es echarle la culpa a JavaScript y no a nuestra falta de interés por saber lo que está pasando.&lt;/p&gt;

&lt;p&gt;Si te sentiste identificado o simplemente quieres saber de un modo sencillo lo que es &lt;em&gt;this&lt;/em&gt;, sigue leyendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué NO es this?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NO es una referencia a sí mismo.&lt;/strong&gt; Esta quizás es la respuesta más común que escuchamos, decir que &lt;em&gt;this&lt;/em&gt; es una referencia a la función en la que se encuentra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NO es una referencia al &lt;em&gt;lexical scope&lt;/em&gt; de la función.&lt;/strong&gt; Tampoco es una referencia al &lt;em&gt;scope&lt;/em&gt; que definimos al momento de escribir nuestro código. (Más sobre &lt;em&gt;lexical scope&lt;/em&gt; en un próximo post).&lt;/p&gt;

&lt;h2&gt;
  
  
  ...entonces ¿Qué es this?
&lt;/h2&gt;

&lt;p&gt;Es un binding que se hace cuando una función es invocada, y a lo que realmente hace referencia this dependerá completamente del &lt;strong&gt;lugar en dónde se ha llamado&lt;/strong&gt; (call-site) dicha función, no el &lt;strong&gt;lugar en donde se ha declarado.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pero, ¿cómo funciona? si es un &lt;em&gt;binding&lt;/em&gt;, ¿se puede cambiar? Veamos ahora qué &lt;strong&gt;4&lt;/strong&gt; reglas se aplican para determinar que es &lt;em&gt;this&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Default Binding
&lt;/h3&gt;

&lt;p&gt;Esta es la que se aplica cuando ninguna otra regla pueda hacerlo. El siguiente ejemplo lo ilustra:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var a = 2;

foo(); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;En este caso &lt;strong&gt;this.a&lt;/strong&gt; hace referencia a la variable global a que hemos declarado. Como la llamada a la función &lt;strong&gt;foo()&lt;/strong&gt; es una llamada común y ninguna de las otras reglas que veremos más adelante es aplicable, la regla por defecto es la ganadora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implicit Binding
&lt;/h3&gt;

&lt;p&gt;La siguiente regla aplicaría cuando el lugar en donde se hace la llamada tiene un objeto como contexto, por ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var obj = {
    a: 2,
    foo: foo
};

obj.foo(); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Como &lt;strong&gt;obj&lt;/strong&gt; es &lt;em&gt;this&lt;/em&gt; para &lt;strong&gt;foo(), this.a&lt;/strong&gt; sería sinónimo de &lt;strong&gt;obj.a&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cabe destacar que solo el nivel más alto de la cadena de referencias a una propiedad es la que se tomaría en cuenta, es decir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var obj2 = {
    a: 42,
    foo: foo
};

var obj1 = {
    a: 2,
    obj2: obj2
};

obj1.obj2.foo(); // 42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Una de las cosas que pueden frustrarnos a veces es la pérdida de este &lt;em&gt;binding&lt;/em&gt; implícito, lo que usualmente significa que se aplicaría la regla por defecto y &lt;em&gt;this&lt;/em&gt; acabaría siendo el global &lt;em&gt;object o undefined&lt;/em&gt;, depende de si usamos &lt;em&gt;strict mode&lt;/em&gt; o no, por ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var obj = {
    a: 2,
    foo: foo
};

var bar = obj.foo; // alias con referencia a la función

var a = 'global!!'; // propiedad 'a' en objeto global

bar(); // 'global!!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Puede parecer que &lt;strong&gt;bar&lt;/strong&gt; es una referencia a &lt;strong&gt;obj.foo&lt;/strong&gt; pero en realidad es una referencia a &lt;strong&gt;foo&lt;/strong&gt; en sí mismo, además recordemos que lo que importa es el lugar en donde se llama y &lt;strong&gt;bar()&lt;/strong&gt; es una llamada común sin decoración por lo que la regla por defecto aplicaría.&lt;/p&gt;

&lt;p&gt;Otro escenario muy común donde ocurre esto es cuando pasamos una función como &lt;strong&gt;callback&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

function doFoo(fn) {
    // 'fn' otra referencia a foo

    fn(); // &amp;lt;-- call-site
}

var obj = {
    a: 2,
    foo: foo
};

var a = 'global!!'; // propiedad 'a' en objeto global

doFoo(obj.foo); // 'global!!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Lo mismo ocurre si usamos una función &lt;em&gt;built-in&lt;/em&gt; en JavaScript:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var obj = {
    a: 2,
    foo: foo
};

var a = 'global!!'; // propiedad 'a' en objeto global

setTimeout(obj.foo, 100); // 'global!!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Veamos ahora cómo “solucionar” este problema con la siguiente regla.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicit Binding
&lt;/h3&gt;

&lt;p&gt;En la regla anterior creamos una propiedad en un objeto y le asignamos una referencia a una función para que se enlazara &lt;em&gt;this&lt;/em&gt; al objeto de manera indirecta.&lt;/p&gt;

&lt;p&gt;Pero, y si queremos forzar a una función a que use un objeto en particular para &lt;em&gt;this&lt;/em&gt;, sin tener que crear una propiedad con la referencia a la función dentro del objeto en cuestión?&lt;/p&gt;

&lt;p&gt;¿Te suenan los métodos &lt;strong&gt;call o apply&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Todas las funciones tienen estos métodos disponibles, a través de su &lt;strong&gt;[[Prototype]]&lt;/strong&gt;, los cuales son muy útiles para lograr este cometido.&lt;/p&gt;

&lt;p&gt;¿Cómo funcionan? Ambos reciben, como primer parámetro, el objeto que deben usar como &lt;em&gt;this&lt;/em&gt;, y luego invocan la función. Cómo estamos indicando directamente lo que queremos que sea &lt;em&gt;this&lt;/em&gt;, lo llamamos &lt;em&gt;binding&lt;/em&gt; explícito.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    console.log(this.a);
}

var obj = {
    a: 2
};

foo.call(obj); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Desafortunadamente, el &lt;em&gt;explicit binding&lt;/em&gt; sigue sin ofrecernos una solución al problema planteado anteriormente.&lt;/p&gt;

&lt;p&gt;Veamos una variación de este patrón que sí puede darnos una salida y que se introdujo como una utilidad &lt;em&gt;built-in&lt;/em&gt; en JavaScript a partir de ES5.&lt;/p&gt;

&lt;p&gt;Estamos hablando de &lt;strong&gt;Function.prototype.bind&lt;/strong&gt;, y se usa de la siguiente manera:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hard Binding
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo(something) {
    console.log(this.a, something);
    return this.a + something;
}

var obj = {
    a: 2
};

var bar = foo.bind(obj);

var b = bar(3); // 2 3
console.log(b); // 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;bind(...)&lt;/strong&gt; retorna una nueva función que está forzada a llamar a la función original usando el contexto de &lt;em&gt;this&lt;/em&gt; que le hemos especificado.&lt;/p&gt;

&lt;h3&gt;
  
  
  new Binding
&lt;/h3&gt;

&lt;p&gt;La cuarta y última regla se aplica cuando una función es invocada usando &lt;strong&gt;new (constructor call).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esto es lo que pasa cuando usamos &lt;strong&gt;new&lt;/strong&gt; frente a una función:&lt;/p&gt;

&lt;p&gt;Un objeto nuevo se crea de la nada.&lt;/p&gt;

&lt;p&gt;El objeto nuevo se establece como &lt;em&gt;this&lt;/em&gt; para la llamada de esa función.&lt;/p&gt;

&lt;p&gt;A menos que la función retorne su propio objeto, la llamada retornará automáticamente el nuevo objeto creado.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo(a) {
    this.a = a;
}

var bar = new foo(2);
console.log(bar.a); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Bonus: Lexical this
&lt;/h3&gt;

&lt;p&gt;Este tipo de binding es posible a partir de &lt;strong&gt;ES6&lt;/strong&gt; y se aplica al usar &lt;strong&gt;arrow-functions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este caso se usa el &lt;em&gt;lexical scope&lt;/em&gt; como &lt;em&gt;this&lt;/em&gt;, es decir se tomara del contexto que encierre la llamada a la función.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo() {
    return (a) =&amp;gt; {
        console.log(this.a);
    };
}

var obj1 = {
    a: 2
};

var obj2 = {
    a: 3
};

var bar = foo.call(obj1);
bar.call(obj2); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este tipo de binding ignora todas las reglas previamente mencionadas y no puede ser sobrescrito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;Hemos visto que &lt;strong&gt;&lt;em&gt;this&lt;/em&gt; es un binding&lt;/strong&gt; y que para determinarlo durante la ejecución de una función es necesario encontrar el call-site de esa función.&lt;/p&gt;

&lt;p&gt;Una vez examinado, &lt;strong&gt;4&lt;/strong&gt; reglas pueden aplicar en el siguiente orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;¿Se llamo usando &lt;strong&gt;new&lt;/strong&gt;? Entonces se usa el objeto nuevo que se creo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Se llamo con &lt;strong&gt;call o apply o bind&lt;/strong&gt;? Entonces se usa el objeto especificado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Se llamo bajo el contexto de un objeto? Entonces se usa ese objeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Ninguna de las anteriores? &lt;strong&gt;undefinded&lt;/strong&gt; en &lt;em&gt;strict mode&lt;/em&gt;, sino el objeto global.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fuentes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript"&gt;MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://books.google.es/books?id=cE4BBAAAQBAJ&amp;amp;lpg=PP1&amp;amp;pg=PP1#v=onepage&amp;amp;q&amp;amp;f=false"&gt;You Don't Know JS: this &amp;amp; Object Prototypes&lt;/a&gt; &lt;em&gt;escrito por Kyle Simpson&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
  </channel>
</rss>
