{"componentChunkName":"component---src-templates-tag-template-js","path":"/tag/java-script/page/2","webpackCompilationHash":"a3ac22c47fe06e2afd02","result":{"data":{"site":{"siteMetadata":{"title":"Philip Ackermann","subtitle":"CTO of Cedalo AG @cedalo_com previously @Fraunhofer_FIT 📚 Java/JavaScript/Node.js book author @rheinwerkverlag 🇩🇪 Blogger @heisedc ⚛️ #NodeJS #React #javascript"}},"allMarkdownRemark":{"edges":[{"node":{"html":"<p>Liebe Leserinnen und Leser,</p>\n<p>Willkommen auf der neuen Website zum <strong>umfassenden JavaScript-Handbuch</strong>, die ab heute online ist. Ergänzend zu der <a href=\"https://www.rheinwerk-verlag.de/3900/\">offiziellen Website beim Rheinwerk-Verlag</a> möchte ich hier zusätzliche Informationen und Materialien zum Buch und zum Thema JavaScript im Allgemeinen zur Verfügung stellen.</p>\n<p>Darüber hinaus können Sie mir über diese Website auch gerne <strong>Feedback</strong> zukommen lassen, entweder über die angegebene E-Mail-Adresse oder über einen der sozialen Kanäle wie etwa <a href=\"https://twitter.com/jshandbuch\">Twitter</a>, <a href=\"https://github.com/cleancoderocker\">GitHub</a>, <a href=\"https://www.xing.com/profile/Philip_Ackermann3\">Xing</a> oder <a href=\"https://de.linkedin.com/in/philipackermann/\">LinkedIn</a>.</p>\n<p>Herzlichst,\nPhilip Ackermann</p>\n<p><small>Autor und Software-Entwickler, <a href=\"http://www.philipackermann.de\">philipackermann.de</a></small></p>\n<!-- more -->","fields":{"slug":"/posts/javascript-handbook/","categorySlug":"/category/java-script-handbuch/"},"frontmatter":{"title":"Neue Website zum Buch","date":"2017-04-04T10:02:53.000Z","category":"JavaScript Handbuch","description":""}}},{"node":{"html":"<h3 id=\"problem\"><a href=\"#problem\" aria-label=\"problem permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Problem</h3>\n<ul>\n<li>\n<p>In <a href=\"%7B%25%20post_url%202016-07-19-inspect-function-calls%20%25%7D\">yesterday’s recipe</a> we saw how to create\na function to inspect function calls. For example this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPerson</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> firstName<span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> lastName\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>… produced this output:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">createPerson called with args: John, Doe</code></pre></div>\n</li>\n<li>\n<p>Today we are gonna improve this recipe and create a generic function <code class=\"language-text\">before()</code> to create functions\nthat execute some code before the original function is called:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">...</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">log</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">fn<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n  fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> inspect <span class=\"token operator\">=</span> <span class=\"token function\">before</span><span class=\"token punctuation\">(</span>log<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"ingredients\"><a href=\"#ingredients\" aria-label=\"ingredients permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ingredients</h3>\n<ul>\n<li>arrow functions</li>\n<li>closures</li>\n<li>partial application</li>\n</ul>\n<h3 id=\"directions\"><a href=\"#directions\" aria-label=\"directions permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directions</h3>\n<ol>\n<li>\n<p>Given: the <code class=\"language-text\">inspect()</code> function from <a href=\"%7B%25%20post_url%202016-07-19-inspect-function-calls%20%25%7D\">yesterday’s recipe</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>We will now change this function step by step to a generic function.</p>\n</li>\n<li>\n<p>Change the name of the function to <code class=\"language-text\">before()</code> and change it in a way that it\ntakes a parameter <code class=\"language-text\">inspect</code> and returns a function (basically you only need to change the\npart <code class=\"language-text\">const inspect = fn</code> to <code class=\"language-text\">const before = inspect =&gt; fn</code>) …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">before</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">inspect</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>… and rename the parameter from <code class=\"language-text\">inspect</code> to <code class=\"language-text\">decorator</code>. We will call this function <em>decorator function</em>\nand this will be the generic way of decorating any function.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">before</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">decorator</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Inside the returned function now call the <em>decorator function</em> passing the <em>function to decorate</em>\nand the arguments:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">before</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">decorator</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">decorator</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Voilá, now we have a generic function <code class=\"language-text\">before()</code> that accepts a <em>decorator function</em> and returns\nanother function that accepts the <em>function to decorate</em>.</p>\n<p>For example this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">before</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">decorator</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">decorator</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">log</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">fn<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n  fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> inspect <span class=\"token operator\">=</span> <span class=\"token function\">before</span><span class=\"token punctuation\">(</span>log<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPerson</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> firstName<span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> lastName\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>… produces the known output:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">createPerson called with args: John, Doe</code></pre></div>\n</li>\n</ol>\n<h3 id=\"notes\"><a href=\"#notes\" aria-label=\"notes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Notes</h3>\n<ul>\n<li>\n<p>Instead of creating a function <code class=\"language-text\">inspect()</code> you can do it like this as well:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">before</span><span class=\"token punctuation\">(</span>log<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>And with the help of <code class=\"language-text\">before()</code> you now can easily create different <em>decorator functions</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">before</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">decorator</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">decorator</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">log</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">fn<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n    fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">logTime</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">fn<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called at '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> inspect <span class=\"token operator\">=</span> <span class=\"token function\">before</span><span class=\"token punctuation\">(</span>log<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> inspectTime <span class=\"token operator\">=</span> <span class=\"token function\">before</span><span class=\"token punctuation\">(</span>logTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPerson</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> firstName<span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> lastName\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// createPerson called with args: John, Doe</span>\n<span class=\"token keyword\">const</span> loggingTimeCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspectTime</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">loggingTimeCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// createPerson called at Wed Jul 20 2016 20:00:00 GMT+0200 (CEST)</span></code></pre></div>\n<h3 id=\"alternative-recipes\"><a href=\"#alternative-recipes\" aria-label=\"alternative recipes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alternative recipes</h3>\n</li>\n<li>Use <a href=\"https://github.com/wycats/javascript-decorators\">class decorators</a>, which will be\nprobably be part of a later version of ECMAScript.</li>\n</ul>","fields":{"slug":"/posts/en/2016-07-20-generic-inspect-function-calls/","categorySlug":null},"frontmatter":{"title":"Create a generic function for inspecting function calls","date":"2016-07-20T08:00:00.000Z","category":null,"description":null}}},{"node":{"html":"<h3 id=\"problem\"><a href=\"#problem\" aria-label=\"problem permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Problem</h3>\n<ul>\n<li>\n<p>You want to create a generic function for inspecting function calls,\nso that each time the <em>inspected function</em> is called its name and its\narguments are printed to the console.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">createPerson</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> firstName<span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> lastName\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"ingredients\"><a href=\"#ingredients\" aria-label=\"ingredients permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ingredients</h3>\n<ul>\n<li>rest parameters</li>\n<li>the <code class=\"language-text\">apply()</code> method</li>\n<li>arrow functions</li>\n</ul>\n<h3 id=\"directions\"><a href=\"#directions\" aria-label=\"directions permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directions</h3>\n<ol>\n<li>\n<p>Create a function <code class=\"language-text\">inspect()</code> that accepts a function (we call this one <em>inspected function</em>)\nand returns another function.\nNote: the returned function will be no arrow function but a “normal” function, because\nthen we have access to the execution context (via the <code class=\"language-text\">this</code> keyword).</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Inside the returned function call the <em>inspected function</em> using the <code class=\"language-text\">apply()</code> method and\npass the execution context and the arguments.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Now before the call of the <em>inspected function</em> add a console output printing the name (<code class=\"language-text\">fn.name</code>)\nand the arguments (<code class=\"language-text\">args</code>) of the <em>inspected function</em>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Voilá, now we have a function to inspect other functions. For example this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPerson</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> firstName<span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> lastName\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> loggingCreatePerson <span class=\"token operator\">=</span> <span class=\"token function\">inspect</span><span class=\"token punctuation\">(</span>createPerson<span class=\"token punctuation\">)</span>\n<span class=\"token function\">loggingCreatePerson</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>… generates this output:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">createPerson called with args: John, Doe</code></pre></div>\n</li>\n</ol>\n<h3 id=\"notes\"><a href=\"#notes\" aria-label=\"notes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Notes</h3>\n<ul>\n<li>In tomorrow’s recipe we will see how to improve the <code class=\"language-text\">inspect()</code> function by using a more\ngeneric approach.</li>\n<li>\n<p>If you don’t need access to the execution context, you can also use an arrow function for\nthe returned function:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">inspect</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">.</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' called with args: '</span> <span class=\"token operator\">+</span> args<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"alternative-recipes\"><a href=\"#alternative-recipes\" aria-label=\"alternative recipes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alternative recipes</h3>\n<ul>\n<li>Use the <code class=\"language-text\">inspect()</code> function of the Command Line API, available for example in Chrome, Safari and Firefox.</li>\n</ul>","fields":{"slug":"/posts/en/2016-07-19-inspect-function-calls/","categorySlug":null},"frontmatter":{"title":"Create a function for inspecting function calls","date":"2016-07-19T08:00:00.000Z","category":null,"description":null}}},{"node":{"html":"<h3 id=\"problem\"><a href=\"#problem\" aria-label=\"problem permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Problem</h3>\n<ul>\n<li>\n<p>In <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a> we saw how to use template strings to generate an HTML list\nbased on an array of objects:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> persons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'London'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Dave'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n     city<span class=\"token punctuation\">:</span> <span class=\"token string\">'London'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Carpenter'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>\n<p>However our solution had one limitation: it only works for those objects that\nhave <code class=\"language-text\">firstName</code> and <code class=\"language-text\">lastName</code> properties but it doesn’t work for other objects.\nFor example the following code …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> cities <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Ney York'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Miami'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'San Francisco'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Chicago'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Seattle'</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… generates this HTML code:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n</li>\n<li>So what we really want is a generic function <code class=\"language-text\">listItem()</code> that works with every type of object.\nFortunately this is relatively easy as we see in today’s recipe.</li>\n</ul>\n<h3 id=\"ingredients\"><a href=\"#ingredients\" aria-label=\"ingredients permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ingredients</h3>\n<ul>\n<li>the <code class=\"language-text\">htmlList()</code> function from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a></li>\n<li>the <code class=\"language-text\">htmlListItem()</code> function from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a></li>\n<li>closures</li>\n<li>partial application</li>\n</ul>\n<h3 id=\"directions\"><a href=\"#directions\" aria-label=\"directions permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directions</h3>\n<ol>\n<li>\n<p>Given: the two functions <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>The idea now is that we change <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> to accept a function as\nparameter which determines the value (based on the particular object) that should be used for the list item\n(we call this function <em>value function</em>).\nBoth <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> will then return functions and close in the <em>value function</em>.</p>\n</li>\n<li>\n<p>Change <code class=\"language-text\">htmlListItem()</code> to accept a function (the <em>value function</em>) and return another function (this is where the closure comes in) …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>… and inside the returned function call the <em>value function</em> with the particular object as argument.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Change <code class=\"language-text\">htmlList()</code> as well so that it accepts a <em>value function</em> and returns another function (again, this creates a closure) …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>… and inside the returned function call <code class=\"language-text\">htmlListItem()</code> with the <em>value function</em> as argument.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListItem</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Voilá, now you can use the <code class=\"language-text\">htmlList()</code> to produce the HTML list code for any type of objects by simply passing\na <em>value function</em> that determines the value used for the label of the list item:</p>\n<p>For example this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… produces this HTML code …</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Ney York<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Miami<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>San Francisco<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Chicago<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Seattle<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>… while this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… produces this HTML code:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>John Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Dave Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Carpenter<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n</li>\n</ol>\n<h3 id=\"notes\"><a href=\"#notes\" aria-label=\"notes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Notes</h3>\n<ul>\n<li>\n<p>You can also use partial application to create partial applied versions of <code class=\"language-text\">htmlList()</code>,\ni.e., functions where the <em>value function</em> is closed in.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> htmlListForCities <span class=\"token operator\">=</span>\n  <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> htmlListForPersons <span class=\"token operator\">=</span>\n  <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListForCities</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListForPersons</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"alternative-recipes\"><a href=\"#alternative-recipes\" aria-label=\"alternative recipes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alternative recipes</h3>\n<ul>\n<li>Use a template engine like EJS or Jade.</li>\n<li>\n<p>Another alternative is to use <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a>\nand introduce a common method in all objects, e.g., <code class=\"language-text\">toString()</code> or <code class=\"language-text\">getListLabel()</code>.</p>\n<p>However this approach has two disadvantages: first you cannot use object literal notation for creating the objects\nwithout defining the method over and over again in every object. That means you would need to use some sort of\ninheritance, which is not bad, but it adds complexity to your object model.</p>\n<p>The second disadvantage is that the logic of how an object is displayed in the generated list is tightly\ncoupled to the object. If you want to change the value, you always need to change the object model.\nWith the technique shown in today’s recipe we decoupled the logic from the object model (inside the <em>value function</em>).</p>\n<p>Finally, an advantage of today’s recipe is that you can easily create different <em>value functions</em> for one and the same\nobject model. For example, you could create two <em>value functions</em>, one just displaying the first name, one just displaying\nthe last name of a person:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> htmlListFirstName <span class=\"token operator\">=</span> <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> htmlListLastName <span class=\"token operator\">=</span> <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span></code></pre></div>\n<p>With <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a> this is not that easy.</p>\n</li>\n</ul>","fields":{"slug":"/posts/en/2016-07-18-generic-html-list-using-template-strings/","categorySlug":null},"frontmatter":{"title":"Create an HTML list based on an array using template strings - part 2","date":"2016-07-18T08:00:00.000Z","category":null,"description":null}}},{"node":{"html":"<h3 id=\"problem\"><a href=\"#problem\" aria-label=\"problem permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Problem</h3>\n<p>You want to create an HTML list based on an array of objects.</p>\n<h3 id=\"ingredients\"><a href=\"#ingredients\" aria-label=\"ingredients permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ingredients</h3>\n<ul>\n<li>template strings</li>\n<li>the <code class=\"language-text\">map()</code> method</li>\n</ul>\n<h3 id=\"directions\"><a href=\"#directions\" aria-label=\"directions permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directions</h3>\n<ol>\n<li>\n<p>Given: an array of objects …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> persons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Dave'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Carpenter'</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>… and you want to create a function <code class=\"language-text\">htmlList()</code> that takes this array …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>… and creates the following HTML code:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>John Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Dave Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Carpenter<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n</li>\n<li>\n<p>Create a function <code class=\"language-text\">htmlList()</code> that accepts an array and returns a template string.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Add the HTML code for the list to the template string.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul>&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Add an embedded expression between the <code class=\"language-text\">&lt;ul&gt;</code> and <code class=\"language-text\">&lt;/ul&gt;</code> tags.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> `<span class=\"token operator\">&lt;</span>ul<span class=\"token operator\">></span>$<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>ul<span class=\"token operator\">></span>`</code></pre></div>\n</li>\n<li>\n<p>Now create another function <code class=\"language-text\">htmlListItem()</code> that accepts an object\nand returns a template string containing the code for one single list item\n(using an embedded expression and returning the concatenation of <code class=\"language-text\">firstName</code>\nand <code class=\"language-text\">lastName</code>).</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> `<span class=\"token operator\">&lt;</span>ul<span class=\"token operator\">></span>$<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>ul<span class=\"token operator\">></span>`</code></pre></div>\n</li>\n<li>\n<p>Now inside the embedded expression in the <code class=\"language-text\">htmlList()</code> function call the <code class=\"language-text\">map()</code> method\non the array and pass the <code class=\"language-text\">htmlListItem()</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Finally join the result of the <code class=\"language-text\">map()</code> function using the <code class=\"language-text\">join()</code> method …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>And adjust the formatting of the output:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>Alternatively you use <code class=\"language-text\">\\n</code> and <code class=\"language-text\">\\t</code> to format the output:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>Voilá, a delicious function that creates an HTML list based on an object array:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">```javascript\nconsole.log(htmlList(persons))\n```\n\nAnd the generated HTML code looks like this:\n\n```html\n&lt;ul&gt;\n  &lt;li&gt;JohnDoe&lt;/li&gt;\n  &lt;li&gt;JaneDoe&lt;/li&gt;\n  &lt;li&gt;JaneSmith&lt;/li&gt;\n  &lt;li&gt;DaveSmith&lt;/li&gt;\n  &lt;li&gt;JaneCarpenter&lt;/li&gt;\n&lt;/ul&gt;\n```</code></pre></div>\n<h3 id=\"notes\"><a href=\"#notes\" aria-label=\"notes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Notes</h3>\n<ul>\n<li>\n<p>One limitation of the code shown is that it only works for arrays of person objects, i.e., for\narrays of objects that have the properties <code class=\"language-text\">firstName</code> and <code class=\"language-text\">lastName</code>, because <code class=\"language-text\">htmlListItem()</code>\ndepends on those properties.</p>\n<p>In tomorrow’s recipe we will see how to remove this coupling and adjust both the <code class=\"language-text\">htmlList()</code> and\nthe <code class=\"language-text\">htmlListItem()</code> function to work with any type of objects.</p>\n</li>\n</ul>\n<h3 id=\"alternative-recipes\"><a href=\"#alternative-recipes\" aria-label=\"alternative recipes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alternative recipes</h3>\n<ul>\n<li>Use a template engine like EJS or Jade.</li>\n</ul>","fields":{"slug":"/posts/en/2016-07-17-html-list-using-template-strings/","categorySlug":null},"frontmatter":{"title":"Create an HTML list based on an array using template strings - part 1","date":"2016-07-17T08:00:00.000Z","category":null,"description":null}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"tag":"JavaScript","currentPage":2,"postsLimit":5,"postsOffset":10,"prevPagePath":"/tag/java-script/page/1","nextPagePath":"/tag/java-script/page/3","hasPrevPage":true,"hasNextPage":true}}}