{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/es2017-arrow-func-syntax/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"0e12e0a6-f1bc-54fc-a12d-7c2c870e0e48","excerpt":"シンプルすぎて難解？昨今のNode.jsのオブジェクト周りの構文をまとめてみたに続いて、今度はアロー関数編です。\nおそらく今まではこんな感じで関数を書いてたと思います それがアロー関数の構文を使用すると、const hoge = options =>…","html":"<p><a href=\"/post/es2017-object-syntax/\">シンプルすぎて難解？昨今のNode.jsのオブジェクト周りの構文をまとめてみた</a>に続いて、今度はアロー関数編です。\nおそらく今まではこんな感じで関数を書いてたと思います</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">hoge</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">options</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>それがアロー関数の構文を使用すると、<code>const hoge = options => 1</code>なります<br>\nめちゃくちゃ短くて楽、特に高階関数とか書き出すと欠かせない書き方なんですが、構文のルールが結構複雑なので纏めてみようと思います</p>\n<p>ちなみに、アロー関数におけるthisやスコープの話はしません。あくまで構文の話だけにとどめます。</p>\n<!--more-->\n<h2 id=\"中身が一行の場合\" style=\"position:relative;\"><a href=\"#%E4%B8%AD%E8%BA%AB%E3%81%8C%E4%B8%80%E8%A1%8C%E3%81%AE%E5%A0%B4%E5%90%88\" aria-label=\"中身が一行の場合 permalink\" class=\"autolink-header before\"><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>中身が一行の場合</h2>\n<p>まずはベーシックなケースから。<br>\n中身の処理が１行しかない場合、</p>\n<ul>\n<li><code>{}</code>が不要</li>\n<li>自動的に式の値が戻り値になる</li>\n<li>returnはつけたら構文エラー。なお戻り値がないvoid的な関数は作れない</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// と等価</span>\n<span class=\"token comment\">// function hoge () {</span>\n<span class=\"token comment\">//     return 1 + 1</span>\n<span class=\"token comment\">// }</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">hoge</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span></code></pre></div>\n<p>処理が複数行に渡る場合にはルールがちょっと変わります</p>\n<h2 id=\"1文で戻り値がオブジェクト定義式の場合\" style=\"position:relative;\"><a href=\"#1%E6%96%87%E3%81%A7%E6%88%BB%E3%82%8A%E5%80%A4%E3%81%8C%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%AE%9A%E7%BE%A9%E5%BC%8F%E3%81%AE%E5%A0%B4%E5%90%88\" aria-label=\"1文で戻り値がオブジェクト定義式の場合 permalink\" class=\"autolink-header before\"><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>1文で戻り値がオブジェクト定義式の場合</h2>\n<p>ただし、戻り値でオブジェクト定義式（ex. <code>return { age: 25, ... }</code>）を利用する場合、書き方が変わります\n戻り値がオブジェクトの場合、<code>()</code>で囲う必要があります</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// NG</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">map</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> gender <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> gender <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// OK</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">map</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> gender <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> gender <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"中身が複数行の場合\" style=\"position:relative;\"><a href=\"#%E4%B8%AD%E8%BA%AB%E3%81%8C%E8%A4%87%E6%95%B0%E8%A1%8C%E3%81%AE%E5%A0%B4%E5%90%88\" aria-label=\"中身が複数行の場合 permalink\" class=\"autolink-header before\"><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>中身が複数行の場合</h2>\n<p>中身の処理が複数の文に渡る場合、書き方が変わります<br>\n複数行になるともともとの書き方とあまり大差なくなります</p>\n<ul>\n<li><code>{}</code>が必要。<code>{}</code>なしに複数の文を書こうとすると構文エラー</li>\n<li>明示的な<code>return</code>が必要。returnしない場合戻り値はundefined</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// と等価</span>\n<span class=\"token comment\">// function hoge () {</span>\n<span class=\"token comment\">//     const prefix = 'hoge'</span>\n<span class=\"token comment\">//     return `${prefix}_foo_bar`</span>\n<span class=\"token comment\">// }</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">hoge</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> prefix <span class=\"token operator\">=</span> <span class=\"token string\">'hoge'</span>\n    <span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>prefix<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">_foo_bar</span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"引数が一つの場合\" style=\"position:relative;\"><a href=\"#%E5%BC%95%E6%95%B0%E3%81%8C%E4%B8%80%E3%81%A4%E3%81%AE%E5%A0%B4%E5%90%88\" aria-label=\"引数が一つの場合 permalink\" class=\"autolink-header before\"><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>引数が一つの場合</h2>\n<p>引数が１つの場合、基本的には引数の<code>()</code>を省略可能です</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">increment</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n<span class=\"token function\">increment</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 2</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">prefixer</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">prefix</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">str</span> <span class=\"token operator\">=></span> prefix <span class=\"token operator\">+</span> str\n<span class=\"token keyword\">const</span> log <span class=\"token operator\">=</span> <span class=\"token function\">prefixer</span><span class=\"token punctuation\">(</span><span class=\"token string\">'log: '</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hoge'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 'log: hoge'</span>\n<span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'foo'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 'log: foo'</span>\n<span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'bar'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 'log: bar'</span></code></pre></div>\n<p>ただし、以下の場合には<code>()</code>を付ける必要があります</p>\n<h2 id=\"引数にデフォルト引数を使用する場合\" style=\"position:relative;\"><a href=\"#%E5%BC%95%E6%95%B0%E3%81%AB%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%BC%95%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88\" aria-label=\"引数にデフォルト引数を使用する場合 permalink\" class=\"autolink-header before\"><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>引数にデフォルト引数を使用する場合</h2>\n<p>引数にデフォルト値を与えたい場合は、引数が１こだったとしても、<code>()</code>を付ける必要があります</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// NG</span>\n<span class=\"token comment\">// const hoge = n = 1 => n + 1</span>\n\n<span class=\"token comment\">// OK</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">hoge</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">n <span class=\"token operator\">=</span> <span class=\"token number\">1</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n<span class=\"token function\">hoge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">// 2</span>\n<span class=\"token function\">hoge</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 3</span></code></pre></div>\n<h2 id=\"引数がない場合複数の場合\" style=\"position:relative;\"><a href=\"#%E5%BC%95%E6%95%B0%E3%81%8C%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E8%A4%87%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88\" aria-label=\"引数がない場合複数の場合 permalink\" class=\"autolink-header before\"><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>引数がない場合、複数の場合</h2>\n<p>引数がない場合、引数が２こ以上の場合も<code>()</code>が必要です</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// NG</span>\n<span class=\"token comment\">// const hoge = => 1</span>\n<span class=\"token comment\">// const hoge = n, a => 1</span>\n\n<span class=\"token comment\">// OK</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">hoge</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token number\">1</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">hoge</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">n<span class=\"token punctuation\">,</span> a</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token number\">1</span></code></pre></div>\n<h2 id=\"引数で分割代入する場合\" style=\"position:relative;\"><a href=\"#%E5%BC%95%E6%95%B0%E3%81%A7%E5%88%86%E5%89%B2%E4%BB%A3%E5%85%A5%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88\" aria-label=\"引数で分割代入する場合 permalink\" class=\"autolink-header before\"><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>引数で分割代入する場合</h2>\n<p>Reactの<a href=\"https://hackernoon.com/react-stateless-functional-components-nine-wins-you-might-have-overlooked-997b0d933dbc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Stateless Functional Component</a>なんかでよく登場する書き方だと思います。<br>\n引数を分割代入で受け取る場合もまた、<code>()</code>が必要です。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// NG</span>\n<span class=\"token comment\">// const sum = { a, b, c } => a + b + c</span>\n<span class=\"token comment\">// const sum = [ a, b, c ] => a + b + c</span>\n\n<span class=\"token comment\">// OK</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">sum</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> a <span class=\"token operator\">+</span> b <span class=\"token operator\">+</span> c\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">sum</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c <span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> a <span class=\"token operator\">+</span> b <span class=\"token operator\">+</span> c</code></pre></div>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><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>さいごに</h2>\n<p>アロー関数の構文がもっとも楽に使えるのは、</p>\n<ul>\n<li>引数が１つ（かつ分割代入なし）</li>\n<li>処理が１行</li>\n</ul>\n<p>のときなので、「なるべく小さくシンプルな関数をたくさんつくれ」という言語設計者からのメッセージなのかもしれません</p>","timeToRead":5,"frontmatter":{"title":"条件付きな構文が多い昨今のNode.jsのアロー関数の構文をまとめてみた","tags":["JavaScript","Nodejs"],"date":"June 27, 2017","featuredImage":null}}},"pageContext":{"slug":"/es2017-arrow-func-syntax/","previous":{"fields":{"slug":"/es2017-object-syntax/"},"frontmatter":{"title":"シンプルすぎて難解？昨今のNode.jsのオブジェクト周りの構文をまとめてみた","tags":["JavaScript","Nodejs"]}},"next":{"fields":{"slug":"/migrate-wp-to-middleman-and-netlify/"},"frontmatter":{"title":"Wordpressで運用していたブログをMiddleman+Netlifyに変更した","tags":["Wordpress","AWS","Middleman","Netlify"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}