<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>takoyaki_ws.log</title>
        <link>https://velog.io/</link>
        <description>FrontEnd Developer</description>
        <lastBuildDate>Wed, 22 Mar 2023 13:10:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>takoyaki_ws.log</title>
            <url>https://images.velog.io/images/takoyaki_ws/profile/9eb5159c-79c5-4e4b-a759-ae2ced016d5e/탁호.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. takoyaki_ws.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/takoyaki_ws" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[코딩테스트 문제풀이 #1]]></title>
            <link>https://velog.io/@takoyaki_ws/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-1</link>
            <guid>https://velog.io/@takoyaki_ws/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-1</guid>
            <pubDate>Wed, 22 Mar 2023 13:10:05 GMT</pubDate>
            <description><![CDATA[<h3 id="중복된-숫자-개수">중복된 숫자 개수</h3>
<blockquote>
<p>정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.</p>
</blockquote>
<pre><code class="language-javascript">function solution(array, n) {
    var answer = 0;

    array.filter(v =&gt; {
        return v === n ? answer++ : null
    });

      // 다른풀이
    // var arr = [];
    // arr = array.filter(v =&gt; {
    //     return v === n ? answer++ : null
    // });
    // answer = arr.length

    return answer;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/takoyaki_ws/post/d2709ade-690e-4f4c-9a9e-75400263df76/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] Closure (클로저)]]></title>
            <link>https://velog.io/@takoyaki_ws/javascript-Closure-%ED%81%B4%EB%A1%9C%EC%A0%80</link>
            <guid>https://velog.io/@takoyaki_ws/javascript-Closure-%ED%81%B4%EB%A1%9C%EC%A0%80</guid>
            <pubDate>Wed, 17 Jun 2020 01:20:10 GMT</pubDate>
            <description><![CDATA[<h2 id="closure-클로저">Closure (클로저)</h2>
<blockquote>
<p>비공개 변수를 갖고 있는 함수.</p>
</blockquote>
<ul>
<li>예제 코드</li>
</ul>
<pre><code class="language-javascript">var addClosure = function() {
  var result = &#39;takoyaki&#39;
  return function() {
    console.log(result)
  }
}
var closure = addClosure()
closure()</code></pre>
<ul>
<li>위 <code>closure()</code> 함수를 호출 할 경우 아래와 같이 전역,함수 컨텍스트가 생성된다.</li>
</ul>
<pre><code class="language-javascript">&quot;전역 컨텍스트&quot;: {
    변수객체: {
        arguments: null,
        variable: [{addClosure: Function}, &#39;closure&#39;]
    },
    scopechain: [&#39;전역 변수객체&#39;],
    this: window
}
&quot;addClosure 컨텍스트&quot;: {
    변수객체: {
        arguments: null,
        variable: [{result: &#39;takoyaki&#39;}]
    },
    scopechain: [&#39;addClosure 변수객체&#39;, &#39;전역 변수객체&#39;],
    this: window
}</code></pre>
<blockquote>
<p>중요한 것은 <code>closure = addClosure();</code> 할 때, <code>function</code>을 <code>return</code>하는데,<code>function</code> 선언시의 <code>scope chain</code>은 <code>lexical scoping</code>에 의해, <code>[&#39;addClosure 변수객체&#39;, &#39;전역 변수객체&#39;]</code>를 포함한다. 따라서 <code>closure</code>를 호출 할 때의 <code>컨텍스트</code>는 아래와 같다.</p>
</blockquote>
<pre><code class="language-javascript">&quot;closure 컨텍스트&quot;: {
    변수객체: {
        arguments: null,
        variable: null,
    },
    scopechain: [&#39;closure 변수객체&#39;, &#39;addClosure 변수객체&#39;, &#39;전역 변수객체&#39;],
    this: window
}</code></pre>
<blockquote>
<p>따라서, <code>closure</code> 함수에서 <code>scope chain</code>을 통해 <code>addClosure</code>의 <code>result</code> 변수에 접근 할 수 있다. 아래 예제를 통해 알아보자.</p>
</blockquote>
<pre><code class="language-javascript">var counter = function() {
  var count = 0
  function changeCount(num) {
    count += num
  }
  return {
    increase: function() {
      changeCount(5)
    },
    decrease: function() {
      changeCount(-5)
    },
    show: function() {
      console.log(count)
    }
  }
}
var counterClosure = counter()
counterClosure.increase()
counterClosure.show() // 5
counterClosure.decrease()
counterClosure.show() // 0</code></pre>
<blockquote>
<p><code>counter</code> 함수 호출시 <code>return</code>을 통해 <code>counterClosure 컨텍스트</code>에 비공개 변수인 <code>count</code>에 접근할 수 있는 <code>scope chain</code>을 반환 한다. 이렇게 되면, <code>counterClosure</code>에서 계속 <code>count</code>에 접근 할 수 있다.
이 방식으로 <code>비공개 변수</code>를 만들어 활용할 수 있다. <code>비공개 변수</code>이기때문에 외부에서 조작 할 걱정을 덜 수 있다. 프로그램 사용자는 공개한 메소드만 사용하기때문에, 예상 할 수 없는 상황이 일어나는것을 방지 할 수 있다. 명심해야 할 점은 사용자는 예상을 뒤엎는 상황을 만들 수 있기 때문에 모든 경우의 수를 생각하고 있어야 한다.
자바스크립트에서 위와 같은 상황에 대비할 수 있는 기본적인 방법은 <code>클로저</code>이다.</p>
</blockquote>
<blockquote>
<p>단점으로는 잘못 사용했을시, 성능 문제와 메모리 문제가 발생 할 수 있다.
<code>closure</code>의 비공개 변수는 자바스크립트에서 언제 메모리 관리를 해야할 지 모르기 때문에 메모리 낭비로 이어질 수 있다.
메모리 문제가 발생한다면, <code>클로저</code>를 의심 해 볼수있다. 또한 <code>scope chain</code>때문에 속도의 영향이 생긴다.</p>
</blockquote>
<pre><code class="language-javascript">for (var i = 0; i &lt; 10; i++) {
  $(&#39;#target&#39; + i).on(&#39;click&#39;, function() {
    console.log(i)
  })
}</code></pre>
<blockquote>
<p>위 예제코드가 있을때, 얼핏 보면 <code>#target0</code> 부터 <code>#target9</code>까지 제대로 이벤트리스너가 연결 된 것처럼 보인다. 하지만, <code>#target0</code>부터 <code>#target9</code>까지 각각 이벤트리스너가 연결되기는 했지만, 실행 결과는 모두 <code>10</code>이다.
왜 그런지 이해가 가지 않는다면, <a href="https://velog.io/@takoyaki_ws/%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Execution-Context">컨텍스트</a>에 대한 부분을 다시 살펴보기 바란다.
<code>lexical scoping</code>에 의해 함수는 선언할 때 <code>scope</code>가 생성된다.
이벤트리스너 안의 <code>i</code>는 외부의 <code>i</code>를 계속 참조 하고 있는것이다. <code>i</code>는 <code>for</code>문 종료 후 최종적으로는 <code>10</code>이 되기 때문에 결과는 모두 <code>10</code>이 된다.</p>
</blockquote>
<pre><code class="language-javascript">for (var i = 0; i &lt; 10; i++) {
  ;(function(j) {
    $(&#39;#target&#39; + i).on(&#39;click&#39;, function() {
      console.log(i)
    })
  })(i)
}</code></pre>
<blockquote>
<p>위 처럼 <code>IIFE</code>를 사용해 <code>클로저</code>를 만들면, <code>j</code>값은 <code>i</code>에 해당하는 숫자로 고정되기 때문에 해결된다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] Scope]]></title>
            <link>https://velog.io/@takoyaki_ws/javascript-Scope</link>
            <guid>https://velog.io/@takoyaki_ws/javascript-Scope</guid>
            <pubDate>Wed, 17 Jun 2020 01:11:18 GMT</pubDate>
            <description><![CDATA[<h2 id="scope-스코프">Scope 스코프</h2>
<ul>
<li>흔히들 <u>변수의 스코프</u> 라고 말한다.<br/></li>
</ul>
<pre><code>Scope : 1. (무엇을 하거나 이룰 수 있는) 기회
        2. (주제, 조직, 활동 등이 다루는) 범위

[네이버 어학사전]</code></pre><p>지금 현재 말하는 <code>Scope</code>의 의미는 <code>범위</code>에 가깝다고 말할 수 있다.
다시말해, <code>변수의 Scope</code>는 <code>변수를 사용할 수 있는 범위</code>로 해석이 가능하다.
ES5 까지는 <code>Scope</code>의 범위가 <code>함수 단위의 Scope</code>이다.
아래 코드를 보며 이해해 보자.</p>
<pre><code class="language-javascript">// 전역 변수 Scope
var num1 = 5
var num2 = 10

if (num1 &lt; num2) {
  var num3 = 30
} else {
  // 전역 변수는 공유되기때문에 여기서는 var를 생략가능
  var num3 = 50
}

var func = function() {
  // 함수 단위의 Scope가 시작
  var num1 = 15
  var num4 = 20
  console.log(num1) 
  // 15, 현재 스코프에 num1이 있기때문에 현재 스코프의 값을 출력한다.
}
console.log(num3) 
// 30, 함수단위 스코프이기 때문에 같은 전역 공간에 있는 num3값을 출력한다.
func()
console.log(num4) 
// Uncaught ReferenceError : num4 is not defined,
// 함수 단위의 스코프이기 때문에 함수에서 쓰인 변수는 함수에서만 사용 가능하다.</code></pre>
<p>여기서 자바와의 큰 차이점 중 하나를 볼 수 있다.
다른 언어들은 <code>블록 단위</code>의 스코프를 가지고 있어, if문에서도 별도의 스코프를 가지고있지만
자바스크립트에는 <code>함수 단위</code>의 스코프가 존재 한다.</p>
<h2 id="scope-chaining스코프-체이닝">Scope Chaining(스코프 체이닝)</h2>
<pre><code>chaining : 1. 체이닝
           2. 연쇄(적 처리)

[네이버 어학사전]</code></pre><ul>
<li>범위 안에서 연쇄적으로 처리하는(?)
아래 코드를 보며 이해 해 보자.</li>
</ul>
<pre><code class="language-javascript">var num1 = 10
var func1 = function() {
  // 외부 함수 Scope(func1)의 시작
  var num2 = 15
  var func2 = function() {
    // 내부 함수 Scope(func2)의 시작
    // 1. 현재 스코프(func2)에는 num1 변수가 존재 하지 않는다.
    // 2. 스코프 체인을 타고 스코프 func1로 올라간다.
    // 3. 스코프 func1에도 num1 변수가 존재 하지 않는다.
    // 4. 스코프 체인을 타고 전역 스코프로 올라간다.
    // 5. 전역 스코프의 num1변수를 참조해 num1을 출력한다.
    console.log(num1) // 10

    // 1. 현재 스코프(func2)에는 num2 변수가 존재 하지 않는다.
    // 2. 스코프 체인을 타고 스코프 func1로 올라간다.
    // 3. 스코프 func1에 num2 변수를 참조해 num2를 출력한다.
    console.log(num2) // 15
  }
  func2() // 내부 함수 func2 호출
}
func1() // 함수 func1을 호출</code></pre>
<h2 id="strict-mode-strict-mode--mdn">strict mode (<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode">Strict mode | MDN</a>)</h2>
<ul>
<li>ES5에서 새로 생긴 모드이다.</li>
<li>코드의 문법을 좀 더 깐깐하게 검사해서 오류를 표출 하는 모드.</li>
</ul>
<pre><code class="language-javascript">&#39;use strict&#39;
// 전역 스코프 상단에 위 구문을 넣어주거나
// 사용하려는 함수 바디 상단에만 넣어주면 된다.
// 미지원 브라우저는 그냥 문자열로 인식하고 오류를 발생시키지 않는다.

var num1 = 10
var func1 = function() {
  // 전역 스코프에 존재하는 변수이기때문에 덮어씌우면서 정상 작동한다.
  num1 = 30
  // 스코프 체인 상에 존재하지 않는 변수를 var없이 선언하면 오류 발생.
  num2 = 50 // Uncaught ReferenceError: num2 is not defined
}
// 스코프 체인 상에 존재하지 않는 변수를 var없이 선언하면 오류 발생.
num3 = 100 // Uncaught ReferenceError: num3 is not defined
func1()</code></pre>
<h2 id="lexical-scoping렉시컬-스코핑">lexical scoping(렉시컬 스코핑)</h2>
<ul>
<li><code>scope</code>는 함수를 <code>호출</code>할 때가 아니라, <code>선언</code>할 때 생긴다.<ul>
<li>아래 코드에서 <code>console.log</code> 가 어떻게 찍힐지 생각해 보자.</li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">var result = &#39;AAA&#39;
function func() {
  console.log(result)
}
function func2() {
  result = &#39;BBB&#39;
  func()
}
func2() // BBB</code></pre>
<pre><code class="language-javascript">var result = &#39;AAA&#39;
function func3() {
  console.log(result)
}
function func4() {
  var result = &#39;BBB&#39;
  func3()
}
func4() // AAA</code></pre>
<ul>
<li><code>func3</code>의 <code>result</code>는 <code>func4</code>의 지역변수 <code>result</code>가 아니라, 전역변수 <code>result</code>를 바라보고 있다. 이것을 <code>lexical scoping</code>이라고 한다.</li>
<li>함수를 처음 선언하는 순간, 함수 내부의 변수는 자기 <code>scope</code>로부터 가장 가까운 곳에 있는 변수를 참조 한다.</li>
<li>위에서 <code>func3</code> 함수 안의 <code>result</code> 변수는 선언시 가장 가까운 전역변수 <code>result</code>를 참조 한다.</li>
<li>어떠한 짓을 해도 <code>func3</code> 함수가 한 번 선언된 이상 전역변수를 바라보는 <code>result</code> 변수가 다른걸 바라보게 할 수 없다.</li>
<li>유일하게 사용할 수 있는 방법은, 전역변수로 선언된 값을 다른 값으로 변경하는것이다.</li>
<li>전역변수 만드는 것은 <strong><code>지양</code></strong> 해야 한다. 이유는, 변수가 섞일 수 있기 때문이다. 다른사람과 협업해 개발하고, 라이브러리 등을 사용하다보면, 같은 변수이름을 사용해 겹치게되는 일을 겪을 수 있다. 해결 할 수 있는 방법 중 하나는, 전역변수 대신 함수 안에 넣어 지역변수로 넣어 사용하거나, 객체 안의 속성으로 만들어 사용하는 것이다.</li>
</ul>
<pre><code class="language-javascript">var obj = {
  result: &#39;AAA&#39;,
  func: function() {
    console.log(this.result)
  }
}</code></pre>
<ul>
<li>위와같이 하면, <code>obj.result</code>,<code>obj.func()</code> 와 같이 접근 해야 하기때문에 <code>obj</code>를 통째로 바꾸지 않는 이상 겹치게 되는 염려를 덜 수 있다. 하지만, 위 방법의 단점은 누군가 고의적으로 <code>result</code>와 <code>func</code>를 바꿀 수 있다. <code>obj</code>를 통째로 바꾸지 않더라도, 코드 밑에 <code>obj.result = &quot;BBB&quot;</code>를 추가 한다면 <code>obj.func()</code>를 할 경우 <code>AAA</code>대신 <code>BBB</code>가 출력 될 것이다. 그걸 방지 하기 위해서는 아래와 같이 하면 된다.</li>
</ul>
<pre><code class="language-javascript">var f = function() {
  var result = &#39;AAA&#39;
  function func1() {
    console.log(result)
  }
  return { func: func1 }
}
var newFunc = f()
newFunc.func() // AAA</code></pre>
<ul>
<li><code>f()</code> 하게 되면, <code>return</code>에 의해 <code>{func: function(){console.log(result)}}</code>가 <code>newFunc</code>에 저장이 된다. 후에는 <code>newFunc</code>를 통해 <code>func</code>에 접근 할 수 있다. 하지만, <code>result</code>에는 접근 할 수 없다. 함수로 감싼 후 <code>return</code>을 통해 공개변수(<code>func</code>)만 공개하고, 비공개변수(<code>result</code>)는 비공개 하는 방법으로 진행 할 수 있다. 위 코드를 조금 변경하면, 아래와 같다.</li>
</ul>
<pre><code class="language-javascript">var newFunc = (function() {
  var result = &#39;AAA&#39;
  return {
    func: function() {
      console.log(result)
    }
  }
})()
newFunc.func() // AAA</code></pre>
<ul>
<li>위와같이 변경하면, <code>f</code>같은 변수를 한번 더 거치는대신, <code>newFunc</code>에 바로 집어넣어서 사용 할 수 있다. 위의 방법은 <code>IIFE(즉시 호출 함수 표현식)</code> 또는 <code>모듈 패턴</code>이라고 한다.
위 구문은 라이브러리를 만들 때 기본으로 사용되는 표현식이며, <code>비공개 변수</code>가 없는 자바스크립트에 <code>비공개 변수</code> 기능을 만들어 주는 역할을 한다.</li>
</ul>
<h2 id="생각해-보기">생각해 보기.</h2>
<blockquote>
<p>아래 코드를 바로 실행 하지말고, 실행결과를 예상 해 보고, 실행해 예상한 결과와 일치 하는지 비교 해보자.</p>
</blockquote>
<pre><code class="language-javascript">var result = &#39;hello&#39;
function func(s) {
  console.log(s + &#39; &#39; + result)
}
function func1() {
  var result = &#39;Bye&#39;
  console.log(result)
  func(&#39;Hi,&#39;)
}
func1()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] Hoisting]]></title>
            <link>https://velog.io/@takoyaki_ws/javascript-Hoisting</link>
            <guid>https://velog.io/@takoyaki_ws/javascript-Hoisting</guid>
            <pubDate>Wed, 17 Jun 2020 01:02:38 GMT</pubDate>
            <description><![CDATA[<h2 id="hoisting-호이스팅">Hoisting. 호이스팅.</h2>
<pre><code>Hoisting : 1. 끌어올리기
           2. 들어올려 나르기

[네이버 어학사전]</code></pre><pre><code class="language-javascript">console.log(str) // Uncaught ReferenceError: str is not defined</code></pre>
<p>당연하게도 <code>str</code>은 선언조차 되지 않았으니 사용이 불가능하고 존재조차 하지 않는다.
하지만 아래 예제에선 다르다.</p>
<pre><code class="language-javascript">console.log(str1) // undefined, 오류가 발생하지 않는다. 프로그램은 정상.
console.log(func1) // undefined
console.log(func2)
var str1 = &#39;gom&#39;
var func1 = function() {
  console.log(&#39;ABC&#39;)
}
function func2() {
  console.log(&#39;ZXY&#39;)
}</code></pre>
<p>위의 코드에도 처음 <code>str1</code>이 선언되지 않은 변수 이지만 <code>undefined</code>만 내뱉고 프로그램은 죽지 않았다. 이유는 <code>호이스팅</code>이 일어났기 때문이다. 위 코드는 아래와 같이 변환된다고 보면 된다.</p>
<pre><code class="language-javascript">var str1
var func1
function func2() {
  console.log(&#39;ZXY&#39;)
}
console.log(str1)
console.log(func1)
console.log(func2)
str1 = &#39;gom&#39;
func1 = function() {
  console.log(&#39;ABC&#39;)
}</code></pre>
<p><code>함수 선언식</code>에서는 변수없이 함수를 선언한 것으로 함수 전체코드가 <code>호이스팅</code>된다.
하지만 <code>함수 표현식</code>은 변수 선언과 할당을 구분할 수 있어 선언 부문만 <code>호이스팅</code>된다.</p>
<h2 id="함수-선언식-vs-함수-표현식">함수 선언식 vs 함수 표현식</h2>
<p>간단하게 어떤 차이점이 있는지 알아보자.</p>
<h3 id="함수-선언식function-declarations">함수 선언식(Function Declarations)</h3>
<blockquote>
<p>일반적인 프로그래밍 언어에서의 함수 선언과 비슷한 형식.</p>
</blockquote>
<pre><code class="language-javascript">function 함수명(){
    구현 로직
}

function func(){
    return &#39;Function Declarations&#39;;
}
func(); // &#39;Function Declarations&#39;</code></pre>
<h3 id="함수-표현식function-expressions">함수 표현식(Function Expressions)</h3>
<blockquote>
<p>유연한 자바스크립트 언어의 특징을 활용한 선언 방식</p>
</blockquote>
<pre><code class="language-javascript">var 함수명 = function(){
    구현 로직
}

var func = function(){
    return &#39;Function Expressions&#39;;
}
func(); // &#39;Function Expressions&#39;</code></pre>
<h3 id="함수-선언식과-함수-표현식의-차이점">함수 선언식과 함수 표현식의 차이점</h3>
<blockquote>
<p>함수 선언식은 호이스팅에 영향을 받지만, 함수 표현식은 호이스팅에 영향을 받지 않는다.
함수 선언식은 코드를 구현한 위치와 관계없이 자바스크립트의 특징인 <code>호이스팅</code>에 따라 브라우저가 자바스크립트를 해석할 때 맨 위로 끌어 올려진다.
변수와 함수는 사용하기 전 미리 선언해 사용하는것이 의도한대로 코드가 동작한다고 확신을 가지고 개발 할 수 있고, 직접적인 오류 발생으로 파악하기가 더 쉬울것이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] 실행 컨텍스트(Execution Context)]]></title>
            <link>https://velog.io/@takoyaki_ws/%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Execution-Context</link>
            <guid>https://velog.io/@takoyaki_ws/%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Execution-Context</guid>
            <pubDate>Wed, 17 Jun 2020 00:54:46 GMT</pubDate>
            <description><![CDATA[<h2 id="실행-컨텍스트execution-context">실행 컨텍스트(Execution Context)</h2>
<ul>
<li><p><code>전역 컨텍스트</code> 와 <code>함수 컨텍스트</code>.</p>
<ul>
<li>코드를 처음 실행 하는 순간 모든것을 포함하는 <code>전역 컨텍스트</code>가 생긴다.
(실행 하는 순간은, 브라우저가 스크립트를 로딩해서 실행하는것을 뜻한다.)</li>
<li><code>전역 컨텍스트</code>는 모든것을 관리하는 환경이며, 페이지가 종료될 때까지 유지된다.</li>
<li>함수를 호출 할 때마다 <code>함수 컨텍스트</code>가 하나씩 생긴다.</li>
</ul>
</li>
<li><p>컨텍스트의 네 가지 원칙</p>
<ul>
<li><code>전역 컨텍스트</code> 하나 생성 후, 함수 호출시 마다 <code>컨텍스트</code>가 생성된다.</li>
<li><code>컨텍스트</code> 생성 시, <code>컨텍스트</code>안에 변수객체(<code>arguments</code>,<code>variable</code>),<code>scope chain</code>, <code>this</code>가 생성된다.</li>
<li><code>컨텍스트</code> 생성 후 함수가 실행되는데, 사용되는 변수들은 <code>변수객체</code> 안에서 값을 찾고, 없다면 <code>스코프체인</code>으로 올라가며 찾는다.</li>
<li>함수 실행이 끝나면, 해당 <code>컨텍스트</code>는 사라진다.(<code>클로저</code>는 제외) 페이지가 종료되면, <code>전역 컨텍스트</code>가 사라진다.</li>
</ul>
</li>
</ul>
<h2 id="예제코드">예제코드</h2>
<pre><code class="language-javascript">var result = &#39;hello&#39;
function func(s) {
  console.log(s + &#39; &#39; + result)
}
function func1() {
  var result = &#39;Bye&#39;
  console.log(result)
  func(&#39;Hi,&#39;)
}
func1()</code></pre>
<h2 id="전역-컨텍스트">전역 컨텍스트</h2>
<ul>
<li><code>전역 컨텍스트</code>가 생성된 후 <code>변수객체</code>,<code>scope chain</code>, <code>this</code>가 생성된다.
<code>전역 컨텍스트</code>는 <code>arguments</code>가 없고, <code>variable</code>은 해당 스코프들의 변수들을 말한다.
위 코드에서는 <code>result</code>, <code>func</code>, <code>func1</code> 이 있다.</li>
<li><code>scope chain</code>은 자기 자신인 전역 변수객체이다.<ul>
<li><code>this</code>는 따로 설정되어 있지 않으면 <code>window</code>이다.</li>
<li><code>this</code>를 바꾸는 방법은 <code>new</code>를 호출 하는 것이다.
또는, 함수에 다른 <code>this</code>를 <code>bind</code>할 수 있다.</li>
</ul>
</li>
<li>위 코드를 객체 형식으로 표현하면 아래와 같다.</li>
</ul>
<pre><code class="language-javascript">&#39;전역 컨텍스트&#39;: {
    변수객체 : {
        arguments: null,
        variable: [&#39;name&#39;, &#39;func&#39;, &#39;func1&#39;]
    },
    scopechain: [&#39;전역 변수객체&#39;],
    this: window
}</code></pre>
<ul>
<li>코드를 위에서부터 실행하게 되면, <code>func</code>와 <code>func1</code>은 <code>호이스팅</code> 때문에 선언과 동시에 대입이 된다. 그 후, <code>variable</code>의 <code>result</code>에 &#39;hello&#39;가 대입된다.</li>
</ul>
<pre><code class="language-javascript">variable: [{ name: &#39;hello&#39; }, { func: Function }, { func1: Function }]</code></pre>
<h2 id="함수-컨텍스트">함수 컨텍스트</h2>
<ul>
<li>위 예제코드에서 <code>func1()</code>를 하는 순간, 새로운 컨텍스트인 <code>func1()</code> <code>함수 컨텍스트</code>가 생성된다. 생성되었던 <code>전역 컨텍스트</code>는 그대로 유지 되고, <code>arguments</code>는 없고, <code>variable</code>은 <code>result</code>만 존재 한다. <code>scope chain</code>은 <code>func1</code> <code>변수객체</code>와 상위의 <code>전역 변수객체</code>이다. <code>this</code>는 따로 설정하지 않았으므로 <code>window</code>이다.</li>
</ul>
<pre><code class="language-javascript">&#39;func1 컨텍스트&#39;: {
    변수객체: {
        arguments: null,
        variable: [&#39;result&#39;]
    },
    scopechain: [&#39;func1 변수객체&#39;, &#39;전역 변수객체&#39;],
    this: window
}</code></pre>
<blockquote>
<p><code>func1</code>를 호출한 후 차례로 실행 하는데, <code>variable</code>의 <code>result</code>에 <code>Bye</code>를 대입해주고, <code>console.log(result);</code> 의 <code>result</code> 변수는 <code>func1 컨텍스트</code> 안에서 찾으면 된다.</p>
</blockquote>
<blockquote>
<p><code>variable</code>에 <code>result</code>가 <code>Bye</code>로 설정되어있으니, <code>result</code>가 콘솔에 찍히게 된다.
그 다음 <code>func(&quot;Hi,&quot;)</code>은 <code>func1 컨텍스트</code>안에서 <code>func</code> 변수를 찾을 수 없다.</p>
</blockquote>
<blockquote>
<p>찾을 수 없는경우, <code>scope chain</code>에 의해 상위 <code>변수객체</code>에서 찾는다. 상위인 <code>전역 변수객체</code>에서 찾고, <code>variable</code>에 <code>func</code>함수를 호출한다.
<code>func</code>함수가 호출 된 후에는 <code>func 컨텍스트</code>도 생성된다. <code>arguments</code>는 <code>s = Hi,</code>이고, <code>scope chain</code>은 <code>func 스코프</code>와 <code>전역 스코프</code> 이다.</p>
</blockquote>
<blockquote>
<p>여기서 중요한것은, <code>lexical scoping</code>에 따라 <code>func</code> 함수의 <code>scope chain</code>은 선언시 이미 정해져 있다. <code>func1 스코프</code>는 <code>func 컨텍스트</code>의 <code>scope chain</code>이 아니다.
<code>variable</code>은 없고, <code>this</code>는 <code>window</code>이다.</p>
</blockquote>
<pre><code class="language-javascript">&#39;func 컨텍스트&#39;: {
    변수객체: {
        arguments: [{s: &#39;Hi,&#39;}],
        variable: null
    },
    scopechain: [&#39;func 변수객체&#39;, &#39;전역 변수객체&#39;],
    this: window
}</code></pre>
<blockquote>
<p>컨텍스트가 생성된 후 함수가 실행 되는데, 나중에 생긴 <code>func</code>가 가장 먼저 실행된다.
<code>func</code> 함수 안에 <code>console.log(s + &quot; &quot; + result);</code>의 <code>s</code>와 <code>result</code>변수는 <code>func</code>컨텍스트에서 찾으면 된다. <code>s</code>는 <code>arguments</code>에서 찾을 수 있고, <code>result</code>는 <code>func 변수객체</code>에 없으므로, <code>scope chain</code>으로 <code>전역 스코프</code>에서 찾으면 된다.
<code>전역 변수객체</code>로 올라가면, <code>variable</code>에 <code>result</code>값이 <code>hello</code>라고 되어있기 때문에,
<code>Hi, Hello</code>가 된다.
<code>func 컨텍스트</code>는 <code>func1 컨텍스트</code>와 전혀 관계가 없는것이다.
<code>func</code> 함수 종료 후 <code>func 컨텍스트</code>가 사라지고, <code>func1</code> 함수의 실행이 마무리가 된다. <code>func 컨텍스트</code>가 사라지고, <code>func1 컨텍스트</code>도 다음으로 사라지며, 마지막에 <code>전역 컨텍스트</code>도 사라진다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] const, let 사용하기]]></title>
            <link>https://velog.io/@takoyaki_ws/javascript-const-let-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@takoyaki_ws/javascript-const-let-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 16 Jun 2020 07:04:02 GMT</pubDate>
            <description><![CDATA[<h1 id="const-let">const, let</h1>
<ul>
<li><p>ES6 이전의 변수 선언시에 <code>var</code>를 이용해 선언을 했다. ES6에서 새로 추가된 <code>const</code> 와 <code>let</code>을 알아보며, 기존의 <code>var</code>과의 차이점을 알아보자.</p>
</li>
<li><p>현재까지 발표된 버전은 <code>ES10</code>이다. <code>(2020.06)</code></p>
</li>
<li><p>우선, <code>var</code>과의 가장 큰 차이점은 <code>Scope</code> 이다. <code>var</code>은 <code>함수스코프</code>이고, <code>const</code>와<code>let</code>은 <code>블록스코프</code>이다.</p>
</li>
<li><p><code>함수스코프</code>의 경우 함수내의 어느곳에서 호출해도 접근이 가능하지만, <code>블록스코프</code>의 경우 블록내에서만 호출이 가능하며, 해당 블록이 아닌곳 에서는 호출이 불가능하다.</p>
</li>
<li><p>예로, if문 내에서 사용한 <code>var</code> 변수는 if문 외부에서도 호출이 가능하지만, <code>const</code>와<code>let</code>은 불가능하다.</p>
</li>
</ul>
<pre><code class="language-javascript">if (true) {
  var num = 5
}
console.log(num) // 5</code></pre>
<pre><code class="language-javascript">if (true) {
  const num = 5
}
console.log(num) // Uncaught ReferenceError: i is not defined</code></pre>
<pre><code class="language-javascript">if (true) {
  let num = 5
}
console.log(num) // Uncaught ReferenceError: i is not defined</code></pre>
<ul>
<li><code>var</code>에는 아래와 같은 문제가 존재 한다.</li>
</ul>
<pre><code class="language-javascript">var str1 = &#39;AAA&#39;
var str2 = &#39;BBB&#39; // 이미 생성된 변수명으로 재선언 했으나, 아무런 문제가 발생하지 않는다.
str3 = &#39;CCC&#39;
var str3 // hoisting으로 인해 ReferenceError에러가 나지 않는다.

console.log(str3) // CCC</code></pre>
<ul>
<li><code>const</code>와<code>let</code>은 <code>var</code>과 다르게 변수 재선언이 불가능하다.
<code>const</code>와<code>let</code>의 차이점은 변수의 재할당 여부이다.
<code>const</code>는 재할당이 불가능하지만, <code>let</code>은 재할당이 가능하다.</li>
</ul>
<pre><code class="language-javascript">let str = &#39;AAA&#39;
let str = &#39;BBB&#39; // 에러
str = &#39;CCC&#39; // 정상

console.log(str) // CCC</code></pre>
<pre><code class="language-javascript">const str = &#39;AAA&#39;
const str = &#39;BBB&#39; // 에러
str = &#39;CCC&#39; // 에러</code></pre>
<ul>
<li><code>const</code>와<code>let</code>의 한가지 더 다른점은, <code>let</code>은 변수 선언 후에 값을 할당 해도 되지만,   <code>const</code>는 변수 선언시 값을 할당 해야 한다.</li>
</ul>
<pre><code class="language-javascript">let str
str = &#39;AAA&#39; // 정상</code></pre>
<pre><code class="language-javascript">const str; // 에러
str = &quot;AAA&quot;; // 에러

const str = &quot;AAA&quot;; // 정상</code></pre>
<ul>
<li>하지만, <code>const</code>는 새로운 값을 대입하는것을 막을뿐, 할당된 객체나 배열의 요소를 바꾸는것은 가능하다. 즉, 데이터의 주소값만 고정하는 것 이다.</li>
</ul>
<pre><code class="language-javascript">const arr = [1, 2, 3]
arr[0] = 5
console.log(arr) // [5,2,3]</code></pre>
<pre><code class="language-javascript">const obj = { id: &#39;java&#39; }
obj.id = &#39;script&#39;
console.log(obj) // {id: &quot;script&quot;}</code></pre>
]]></description>
        </item>
    </channel>
</rss>