<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>leewoooo_basics.log</title>
        <link>https://velog.io/</link>
        <description>back to basics</description>
        <lastBuildDate>Tue, 13 Sep 2022 14:33:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>leewoooo_basics.log</title>
            <url>https://velog.velcdn.com/images/leewoooo_basics/profile/65e2d39f-e173-4a08-a0ee-cd0362b0081f/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. leewoooo_basics.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/leewoooo_basics" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Back To BASICS (Javascript)]]></title>
            <link>https://velog.io/@leewoooo_basics/Back-To-BASICS-Javascript</link>
            <guid>https://velog.io/@leewoooo_basics/Back-To-BASICS-Javascript</guid>
            <pubDate>Tue, 13 Sep 2022 14:33:05 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter_1-chapter_2">chapter_1, chapter_2</h1>
<br>

<h2 id="var를-지향하자">var를 지향하자!</h2>
<p><code>let</code>과 <code>const</code>는 ES2015부터 추가가 되었다.</p>
<p>var는 ES2015 이전에 사용되었던 변수 선언 방식이다. <code>var</code>는 <strong>함수 스코프를 가지고 있어서 함수 내에서 선언된 변수는 함수 내에서만 접근이 가능하다.</strong> 하지만 <code>let</code>과 <code>const</code>는 <strong>블록 스코프를 가지고 있어서 블록 내에서 선언된 변수는 블록 내에서만 접근이 가능하다.</strong></p>
<p>함수 스코프는 말 그대로 함수의 내부의 공간을 이야기 하며 블록 스코프는 <code>{}</code> 블록의 내부의 공간을 이야기 한다.</p>
<pre><code class="language-js">// var
if (true) {
  var a = 10;
}

console.log(a) // 10 -&gt; var는 함수 스코프이기 때문에 블록으로 인한 스코프 제한에 영향이 없다.

// let, const
if (true) {
  let a = 10;
  const b = 10;
}

console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b); // Uncaught ReferenceError: b is not defined</code></pre>
<p>또한 <code>let</code>과 <code>const</code>는 TDZ(Temporal Dead Zone)이라는 것이 있다. TDZ는 변수가 선언되기 전에 변수에 접근하려고 하면 에러가 발생하는 것을 이야기한다.</p>
<p>let은 <strong>선언 후 할당, 할당 후 재할당이 가능하다.</strong>
const는 <strong>선언과 할당이 동시에 일어나야 하며 재할당이 불가능하다.</strong></p>
<br>

<h2 id="전역-공간-사용의-최소화">전역 공간 사용의 최소화</h2>
<p>전역공간이란? js환경에서 2가지로 나뉠 수 있다. <strong>브라우저 환경</strong>에서는 window 객체를 의미하고 <strong>Node.js 환경</strong>에서는 global 객체를 의미한다.</p>
<p>만약 하나의 html에서 2개의 js파일을(1.js, 2.js) 사용하고 있다고 가정을 하였을 때 1.js에서 선언한 전역변수를 2.js에서 사용이 가능하다 즉 <strong>파일이 나뉘어 있다고 스코프가 분리되어 있지 않다는 것이다.</strong></p>
<p>더 위험한 것은 만약 1.js에서 window 혹은 global의 프로퍼티를 조작을 하게 되면 이 후에 2.js에서는 조작된 프로퍼티를 사용하게 된다.</p>
<p>이 것들을 해결하기 위해 4가지의 방법이 있다.</p>
<ol>
<li>IIFE (즉시 실행 함수)</li>
<li>Module</li>
<li>closure</li>
<li>let과 const를 이용</li>
</ol>
<p>그럼 결론적으로 전역 공간의 사용을 최소화 하는 방법은 아래와 같다.</p>
<ol>
<li>전역 변수 사용하지 않기</li>
<li>지역 변수만 사용한다.</li>
<li>window와 global을 조작하지 않는다.</li>
</ol>
<br>

<h2 id="임시변수제거">임시변수제거</h2>
<p>임시 변수를 사용하게 되면 이 변수를 수정하고 싶은 유혹이 생긴다. 또한 명령형으로 가득한 로직이 되다 보니 코드에 대한 디버깅이 어려워 진다.</p>
<pre><code class="language-js">fuction test() {
  const a = {};
  a.name = &#39;leewoooo&#39;;
  a.age = 27;

  return a
}

// a라는 임시변수를 생성하는 것이 아닌 바로 return을 하는 방향으로 
fuction test() {
  return {
    name: &#39;leewoooo&#39;,
    age: 27
  }
}</code></pre>
<p>이를 해결하기 위한 방법은 아래와 같다.</p>
<ol>
<li>함수를 나눈다.</li>
<li>반환할 수 있는 값은 바로 반환한다.</li>
<li>고차함수를 사용(map, filter, reduce)</li>
<li>선언형 프로그래밍을 지향</li>
</ol>
<br>

<h2 id="호이스팅">호이스팅</h2>
<p>호이스팅이란 변수에 대해 선언과 할당이 분리가 되어는 것을 이야기한다. -&gt; 런타임 시 해당된다.</p>
<p>코드를 작성한 후 스코프를 예상하지만 런타임 시 호이스팅에 의해 <code>var</code>, <code>function</code>으로 선언된 변수 혹은 함수가 최상단으로 올라가게 된다. <strong>그래서 함수를 선언할 때 추천하는 방법은 <code>const</code>로 변수를 선언하고 해당 변수에 함수를 넣어주는 것이다.</strong> (함수 표현 식)</p>
<pre><code class="language-js">// 함수 표현식
const sum = function () {
  return 1 + 2;
};</code></pre>
<p>호이스팅의 문제점은 예측을 하기 어려우며 실행하기 전까지는 결과를 알 수 없다는 것이다. 그렇기 때문에 해결하는 방법은 아래와 같다.</p>
<ol>
<li>var를 이용하는 것이 아닌 let과 const를 사용하자.</li>
<li>함수 표현식을 사용하자.</li>
</ol>
<br>

<h2 id="references">REFERENCES</h2>
<ul>
<li><a href="https://www.udemy.com/course/clean-code-js/">https://www.udemy.com/course/clean-code-js/</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>