<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bear-bear-bear.log</title>
        <link>https://velog.io/</link>
        <description>풀스택을 목표로 하는 학생 개발자입니다.</description>
        <lastBuildDate>Fri, 25 Sep 2020 12:49:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bear-bear-bear.log</title>
            <url>https://images.velog.io/images/bear-bear-bear/profile/63faf6ca-28cd-4352-9851-2339b086b56b/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bear-bear-bear.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bear-bear-bear" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[var와 let의 차이, var의 클로저 이슈]]></title>
            <link>https://velog.io/@bear-bear-bear/var%EC%99%80-let%EC%9D%98-%EC%B0%A8%EC%9D%B4-var%EC%9D%98-%ED%81%B4%EB%A1%9C%EC%A0%80-%EC%9D%B4%EC%8A%88</link>
            <guid>https://velog.io/@bear-bear-bear/var%EC%99%80-let%EC%9D%98-%EC%B0%A8%EC%9D%B4-var%EC%9D%98-%ED%81%B4%EB%A1%9C%EC%A0%80-%EC%9D%B4%EC%8A%88</guid>
            <pubDate>Fri, 25 Sep 2020 12:49:35 GMT</pubDate>
            <description><![CDATA[<h2 id="var-와-let-의-차이"><em>var</em> 와 <em>let</em> 의 차이</h2>
<h4 id="var-는-함수-단위로-수행된다"><em><strong>var</strong></em> 는 함수 단위로 수행된다.</h4>
<blockquote>
</blockquote>
<pre><code class="language-javascript">function foo() {
  {
    var bar = &quot;AA&quot;
  }
  console.log(bar);
}
&gt;
foo();</code></pre>
<blockquote>
<p>&gt;&gt; <em><strong>&quot;AA&quot;</strong></em></p>
</blockquote>
<h4 id="let-은--중괄호-단위로-수행된다"><em><strong>let</strong></em> 은 {} 중괄호 단위로 수행된다.</h4>
<blockquote>
</blockquote>
<pre><code class="language-javascript">function foo() {
  {
    let bar = &quot;AA&quot;
  }
  console.log(bar);
}
&gt;
foo();</code></pre>
<blockquote>
<p>&gt;&gt; <em><strong>Uncaught ReferenceError: bar is not defined</strong></em></p>
</blockquote>
<hr>
<br>

<h2 id="var-의-클로저-관련-대표적-이슈"><em>var</em> 의 <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures">클로저</a> 관련 대표적 이슈</h2>
<blockquote>
</blockquote>
<pre><code class="language-html">&lt;!-- html --&gt;
...
    &lt;button id=&quot;btn0&quot;&gt;btn0&lt;/button&gt;
    &lt;button id=&quot;btn1&quot;&gt;btn1&lt;/button&gt;
    &lt;button id=&quot;btn2&quot;&gt;btn2&lt;/button&gt;
...</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-javascript">/*-- javascript --*/
&gt;
  var btns = [
    document.getElementById(&quot;btn0&quot;),
    document.getElementById(&quot;btn1&quot;),
    document.getElementById(&quot;btn2&quot;),
  ];
  &gt;
  function setClick() {
    for (var i = 0; i &lt; 3; i++) {
      btns[i].onclick = function () {
        console.log(i);
      };
    }
  }
  &gt;
  setClick();
&gt;</code></pre>
<p>버튼 3개가 있고 해당 버튼을 클릭하면 그 버튼에 맞는 숫자를 콘솔로 출력해주는 코드가 있다.</p>
<p>브라우저에서 버튼 0, 1, 2 를 차례로 클릭해보면,</p>
<blockquote>
<p>&gt;&gt; <em><strong>3</strong></em>
&gt;&gt; <em><strong>3</strong></em>
&gt;&gt; <em><strong>3</strong></em></p>
</blockquote>
<p>모두 3이 출력된다. 이건 우리가 원하던 결과가 아니다.</p>
<p>왜 이런 결과가 나올까?</p>
<br>

<p>우리가 위 코드에서 <em><strong>setClick()</strong></em> 을 호출했을때, 콘솔에 출력할 <em><strong>i</strong></em> 값을 찾는 <a href="https://developer.mozilla.org/ko/docs/Glossary/%EC%8A%A4%EC%BD%94%ED%94%84">스코프 체인</a>은 다음과 같다. </p>
<blockquote>
<h4 id="-스코프-체인_변수-i가-var로-선언됐을-경우">// <strong>스코프 체인</strong>_(변수 i가 var로 선언됐을 경우)</h4>
</blockquote>
<p>console.log가 실행된 <em><strong>함수 내부</strong></em> &gt;&gt;
setClick() <em><strong>함수 내부</strong></em></p>
<p>즉, <em><strong>var</strong></em> 는 함수단위로 호출된 값을 찾는다.</p>
<blockquote>
</blockquote>
<pre><code class="language-javascript">...
&gt;
  function setClick() {
    for (var i = 0; i &lt; 3; i++) {
      btns[i].onclick = function () {
        console.log(i);
      };
    } // current i === 3
  }
&gt;
  setClick();
&gt;
...</code></pre>
<p>때문에 위의 코드에서 console.log(i) 구문은 변수 <em><strong>i</strong></em> 탐색 과정에서 현재 실행 중인 for 루프문에서의 변수 <em><strong>i</strong></em> 값은 무시하고, setClick() 내부의 i값, 즉, setClick() 호출시에 스코프 생성 과정에서 한 차례 for루프를 끝낸 <em><strong>i</strong></em> 값, <em><strong>&quot;i=3&quot;</strong></em> 을 로그에 나타내게 된다.</p>
<p>우리는 누른 버튼의 순서에 대응하는 숫자를 콘솔로 출력하고 싶었다.</p>
<p>위 코드를 어떻게 고쳐야 할까?</p>
<h3 id="해결법">해결법</h3>
<blockquote>
</blockquote>
<pre><code class="language-javascript">...
&gt;
function setClick() {
  for (let i = 0; i &lt; 3; i++) {
    btns[i].onclick = function () {
      console.log(i);
    };
  } 
}
...</code></pre>
<p> <strong>가장 간단한 정답은 &quot;<em>var</em> 를 <em>let</em> 으로 바꾼다.&quot; 이다.</strong></p>
<p> <em><strong>let</strong></em> 은 중괄호 {} 단위로 스코프 체인을 생성하며, 따라서 for 루프 내부의 i값을 콘솔에서 출력하게 된다.</p>
<blockquote>
<h4 id="-스코프-체인_변수-i가-let으로-선언됐을-경우">// <strong>스코프 체인</strong>_(변수 i가 let으로 선언됐을 경우)</h4>
</blockquote>
<p>console.log가 실행된 <em><strong>중괄호 내부</strong></em> &gt;&gt;
for 루프문의 <em><strong>중괄호 내부</strong></em></p>
<p>해결법은 생각보다 간단했다!</p>
<br>

<hr>
<p>　</p>
<p><em>참고문서</em></p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures">MDN_클로저</a></p>
<p><em>참고영상</em></p>
<p><a href="https://www.youtube.com/watch?v=RZ3gXcI1MZY&amp;ab_channel=%EC%BD%94%EB%93%9C%EC%A2%85">Youtube코드종_자바스크립트 대표적 클로저 실수를 let으로 해결?</a></p>
]]></description>
        </item>
    </channel>
</rss>