{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"edbb074b-6ad2-579b-9313-0aac87141441","excerpt":"ES6 문법 익숙해지기 자바스크립트는 함수 레벨 스코프(Function-level scope)를 갖는다. 함수 레벨 스코프(Function-level scope) 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉,  함수 내부에서 선언한 변수는 지역 변수 이며  함수 외부에서 선언한 변수는 모두 전역 변수 이다. 블록 레벨 스코프(Block-level scope…","html":"<h1 id=\"es6-문법-익숙해지기\"><a href=\"#es6-%EB%AC%B8%EB%B2%95-%EC%9D%B5%EC%88%99%ED%95%B4%EC%A7%80%EA%B8%B0\" aria-label=\"es6 문법 익숙해지기 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>ES6 문법 익숙해지기</h1>\n<p>자바스크립트는 함수 레벨 스코프(Function-level scope)를 갖는다.</p>\n<ul>\n<li>\n<p>함수 레벨 스코프(Function-level scope)</p>\n<p>함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, <strong>함수 내부에서 선언한 변수는 지역 변수</strong>이며 <strong>함수 외부에서 선언한 변수는 모두 전역 변수</strong>이다.</p>\n</li>\n<li>\n<p>블록 레벨 스코프(Block-level scope)</p>\n<p>코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.</p>\n</li>\n</ul>\n<h2 id=\"let\"><a href=\"#let\" aria-label=\"let 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>let</h2>\n<p>let의 특징</p>\n<ul>\n<li>블록 레벨 스코프</li>\n<li>중복 선언 금지 (이름 같은 변수 중복 선언시 문법 오류)</li>\n<li>호이스팅 : var 키워드로 선언된 변수와는 달리 let 키워드로 선언된 변수를 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생.</li>\n</ul>\n<p>var 키워드는 선언과 초기화가 한번에 이루어진다. let 키워드는 선언 단계와 초기화 단계가 분리되어 진행된다. 참조 에러가 발생하는 이유는 변수가 아직 초기화되지 않았기 때문, 다시 말하면 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문. 스코프 시작 지점부터 초기화 시작 지점까지의 구간을 일시적 사각지대 Teomporal Dead Zone이라고 부른다.</p>\n<p>ES6에서는 호이스팅이 발생하지 않는 것처럼 보이지만 그렇지 않다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> foo <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 전역 변수</span>\n\n<span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>foo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// 1 정상출력</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">let</span> foo <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 전역 변수</span>\n\n<span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>foo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// RefrenceError : foo is not defined</span>\n     <span class=\"token keyword\">let</span> foo <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> 지역 변수\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// ES6의 선언문도 여전히 호이스팅이 발생하기에 참조 에러가 발생!</span></code></pre></div>\n<ul>\n<li>\n<p>클로저</p>\n</li>\n<li>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> ex <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nex<span class=\"token punctuation\">.</span><span class=\"token function\">push</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>i<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nex<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span> <span class=\"token comment\">// 3만 세 번 출력, for 루프의 var i가 전역변수이기 때문.</span>\n\n<span class=\"token comment\">// 이 문제를 해결하기 위해선 아래와 같은 즉시실행 함수가 필요. 클로저를 활용해 해결.</span>\n\n<span class=\"token keyword\">var</span> ex <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</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 keyword\">function</span><span class=\"token punctuation\">(</span>index<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ex<span class=\"token punctuation\">.</span><span class=\"token function\">push</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>index<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nex<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//ex6에서는 클로저 대신 let만 써도 해결</span>\n<span class=\"token keyword\">var</span> ex <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nex<span class=\"token punctuation\">.</span><span class=\"token function\">push</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>i<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span> <span class=\"token comment\">//let은 for loop에서만 유효한 지역변수, i는 자유 변수로서 for 루프의 생명주기가 종료되어도 변수 i를 참조하는 함수가 존재하는 한 계속 유지.</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nex<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n</li>\n<li>\n<p>전역 개체와 let</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> foo <span class=\"token operator\">=</span> <span class=\"token number\">123</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>foo<span class=\"token punctuation\">)</span> <span class=\"token comment\">//123</span>\n\n<span class=\"token keyword\">let</span> bar <span class=\"token operator\">=</span> <span class=\"token number\">123</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>bar<span class=\"token punctuation\">)</span> <span class=\"token comment\">//undefined</span>\n<span class=\"token comment\">// let 전역 변수는 전역 객체의 프로퍼티가 아닙니다.</span>\n<span class=\"token comment\">// let 전역 변수는 보이지 않는 개념블록 내에 존재</span></code></pre></div>\n<h2 id=\"const\"><a href=\"#const\" aria-label=\"const 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>const</h2>\n<p>특징은 let과 대부분 동일함. let은 재할당이 자유로운 반면, const는 재할당이 금지. const는 let과 마찬가지로 블록 레벨 스코프.</p>\n<p>const FOO = 123;</p>\n<p>FOO = 456;</p>\n<p>const는 <strong>반드시 선언과 동시에 할당이 이루어져야 함.</strong></p>\n<p>상수는 가독성과 유지보수의 편의를 위해 적극적으로 사용해야 한다. 예를 들어 아래 코드를 살펴보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 10의 의미를 알기 어렵기 때문에 가독성이 좋지 않다.</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>rows <span class=\"token operator\">></span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 값의 의미를 명확히 기술하여 가독성이 향상되었다.</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">MAXROWS</span> <span class=\"token operator\">=</span> <span class=\"token number\">10</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>rows <span class=\"token operator\">></span> <span class=\"token constant\">MAXROWS</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 조건문 내의 10은 어떤 의미로 사용하였는지 파악하기가 곤란하다. 하지만 네이밍이 적절한 상수로 선언하면 가독성과 유지보수성이 대폭 향상된다.</span></code></pre></div>\n<ul>\n<li>const와 객체</li>\n</ul>\n<p>const는 재할당이 금지된다. 이는 const 변수의 타입이 객체인 경우, 객체에 대한 참조를 변경하지 못한다는 것을 의미한다. 하지만 이때 <strong>객체의 프로퍼티는 보호되지 않는다.</strong> 다시 말하자면 재할당은 불가능하지만 할당된 객체의 내용(프로퍼티의 추가, 삭제, 프로퍼티 값의 변경)은 변경할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Lee'</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// const 변수는 재할당이 금지된다.</span>\n<span class=\"token comment\">// user = {}; // TypeError: Assignment to constant variable.</span>\n<span class=\"token comment\">// 이처럼 user를 재할당하려고 하면 에러.</span>\n\n<span class=\"token comment\">// const로 선언한 객체의 내용은 변경할 수 있다.</span>\nuser<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'Kim'</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span> <span class=\"token comment\">// { name: 'Kim' }</span></code></pre></div>\n<p>객체의 내용이 변경되더라도 객체 타입 변수에 할당된 주소값은 변경되지 않는다. 따라서 객체 타입 변수 선언에는 const를 사용하는 것이 좋다. 만약에 명시적으로 객체 타입 변수의 주소값을 변경(재할당)하여야 한다면 let을 사용한다.</p>\n<p>사용 방법</p>\n<ul>\n<li>\n<p>ES6를 사용한다면 var 키워드는 사용하지 않는다.</p>\n</li>\n<li>\n<p>재할당이 필요한 변수는 let을 사용하고, 변경이 발생하지 않는 (재할당이 필요 없는) 기본 자료형 변수와 객체형 변수에는 const를 사용한다.</p>\n</li>\n</ul>\n<h2 id=\"템플릿-리터럴template-literal\"><a href=\"#%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A6%AC%ED%84%B0%EB%9F%B4template-literal\" aria-label=\"템플릿 리터럴template literal 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>템플릿 리터럴Template literal</h2>\n<p>백틱 문자backtick `를 사용한다.</p>\n<p>일반적인 문자열에서는 줄바꿈이 허용되지 않고, 공백을 표현하기 위해서는 백슬래스로 시작하는 이스케이프 시퀀스Escape Sequence를 사용해야 한다. ES6는 일반적인 문자열과 달리 여러 줄에 걸쳐 문자열을 작성할 수 있고, 모든 공백은 있는 그대로 적용된다.</p>\n<p><code class=\"language-text\">${expression}</code> 을 템플릿 대입문(Template substitution)이라 하며, 자바스크립트 표현식까지도 사용할 수 있다.</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 template-string\"><span class=\"token string\">`1 + 1 = </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> <span class=\"token string\">'test'</span>\n\nconsole<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\">`Hello </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Hello TEST</span>\n<span class=\"token comment\">// 함수 실행 가능</span></code></pre></div>\n<p>학습자료 : <a href=\"https://poiemaweb.com/\">https://poiemaweb.com/</a></p>","frontmatter":{"title":"ES6 let, const, Template literal","date":"September 10, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20180910 ES6 let, const, Template literal/","previous":{"fields":{"slug":"/til/20180909 debugger/"},"frontmatter":{"title":"debugger","category":"TIL"}},"next":{"fields":{"slug":"/til/20180911 ES6 Arrow Function/"},"frontmatter":{"title":"ES6 Arrow Function","category":"TIL"}}}}