{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"629527d5-a071-53e9-9e14-8ac8acbd5699","excerpt":"Arrow Function 화살표 함수는 익명 함수로만 사용 가능하다. 따라서 화살표 함수를 호출하기 위해서는 함수 표현식을 사용한다. function 키워드로 생성한 일반 함수와 화살표 함수의 가장 큰 차이점은 this이다. 일반 함수의 this 일반 함수의 경우는, 해당 함수를 호출하는 패턴에 따라 this에 바인딩되는 객체가 달라진다. 콜백 함수 내부의 this는 전역 객체 window를 가리킨다. 화살표 함수의 this 화살표 함수는 언제나 자신을 포함하는 외부 스코프에서 this…","html":"<h2 id=\"arrow-function\"><a href=\"#arrow-function\" aria-label=\"arrow function 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>Arrow Function</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 매개변수에 따라 차이</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\">// 매개 변수 없을 경우</span>\nx  <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token punctuation\">}</span> <span class=\"token comment\">// 한 개인 경우에, 소괄호 생략 가능</span>\n<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\">// 매개변수가 여러 개인 경우, 소괄호를 생략할 수 없다.</span>\n\n<span class=\"token comment\">// 함수 몸체 지정 방법</span>\nx <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> x <span class=\"token operator\">*</span> x<span class=\"token punctuation\">}</span> <span class=\"token comment\">// single line block</span>\nx <span class=\"token operator\">=</span> <span class=\"token operator\">></span> x <span class=\"token operator\">*</span> x <span class=\"token comment\">// 함수 몸체가 한 줄의 구문이라면 중괄호를 생략할 수 있으며 암묵적으로 return 된다.</span>\n            <span class=\"token comment\">// 위 표현과 동일하다.</span>\n\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> a<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span><span class=\"token operator\">></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> a<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">// 위와 동일. 객체 반환시에 소괄호를 사용한다.</span>\n\n\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// multi line block</span>\n  <span class=\"token keyword\">const</span> x <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> x <span class=\"token operator\">*</span> x<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>\n<p>화살표 함수는 익명 함수로만 사용 가능하다. 따라서 화살표 함수를 호출하기 위해서는 함수 표현식을 사용한다.</p>\n</li>\n<li>\n<p>function 키워드로 생성한 일반 함수와 화살표 함수의 가장 큰 차이점은 this이다.</p>\n</li>\n<li>\n<p>일반 함수의 this</p>\n</li>\n</ul>\n<p>일반 함수의 경우는, 해당 함수를 호출하는 패턴에 따라 this에 바인딩되는 객체가 달라진다. 콜백 함수 내부의 this는 전역 객체 window를 가리킨다.</p>\n<ul>\n<li>화살표 함수의 this</li>\n</ul>\n<p>화살표 함수는 언제나 자신을 포함하는 외부 스코프에서 this를 계승받는다. 다시 말해 <strong>화살표 함수는 자신만의 this를 생성하지 않고 자신을 포함하고 있는 상위 컨텍스트로부터 this를 계승 받는다.</strong> 이를 Lexical this라 한다.</p>\n<ul>\n<li>\n<p>화살표 함수로 메소드 정의하는 건 피해야 한다.</p>\n<p>화살표 함수 내부의 this는 메소드를 호출한 객체를 가리키지 않고 상위 컨텍스트인 전역 객체 window를 가리킨다. 이 경우에 메소드를 위한 단축 표기법 축약 메소드 표현을 사용하면 된다.</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Good</span>\n<span class=\"token keyword\">const</span> person <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Kim'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// === sayHi : function() {</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`Hi </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\nperson<span class=\"token punctuation\">.</span><span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Hi Kim</span></code></pre></div>\n<ul>\n<li>화살표 함수는 prototype 프로퍼티를 가지고 있지 않다.</li>\n</ul>\n<h2 id=\"addeventlistener-함수의-콜백-함수\"><a href=\"#addeventlistener-%ED%95%A8%EC%88%98%EC%9D%98-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98\" aria-label=\"addeventlistener 함수의 콜백 함수 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>addEventListener 함수의 콜백 함수</h2>\n<p>addEventListener 함수의 콜백 함수를 화살표 함수로 정의하면 this가 상위 컨택스트인 전역 객체 window를 가리킨다. (앞의 설명처럼 화살표 함수는 자신만의 this를 생성하지 않고 상위 컨텍스트에서 this를 계승받기 때문.)</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Bad</span>\n<span class=\"token keyword\">var</span> button <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'myButton'</span><span class=\"token punctuation\">)</span>\n\nbutton<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</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><span class=\"token keyword\">this</span> <span class=\"token operator\">===</span> window<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => true</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token string\">'Clicked button'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>따라서 addEventListener 함수의 콜백 함수에서 this를 사용하는 경우, function 키워드로 정의한 일반 함수를 사용하여야 한다. 일반 함수로 정의된 addEventListener 함수의 콜백 함수 내부의 <a href=\"https://poiemaweb.com/js-event#43-dom-level-2-event-listener\">this</a>는 이벤트 리스너에 바인딩된 요소(currentTarget)를 가리킨다. 아래의 경우는 이벤트 리스너의 타겟인 button을 가리킴.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Good</span>\n<span class=\"token keyword\">var</span> button <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'myButton'</span><span class=\"token punctuation\">)</span>\n\nbutton<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</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><span class=\"token keyword\">this</span> <span class=\"token operator\">===</span> button<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => true</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token string\">'Clicked button'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>학습 : <a href=\"http://poiemaweb.com\">http://poiemaweb.com</a></p>","frontmatter":{"title":"ES6 Arrow Function","date":"September 11, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20180911 ES6 Arrow Function/","previous":{"fields":{"slug":"/til/20180910 ES6 let, const, Template literal/"},"frontmatter":{"title":"ES6 let, const, Template literal","category":"TIL"}},"next":{"fields":{"slug":"/til/20180912 ES6 Rest parameter, Spread Operator (배열, 객체 다루기)/"},"frontmatter":{"title":"ES6 Rest parameter, Spread Operator (배열, 객체 다루기)","category":"TIL"}}}}