<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bufo_g_p.log</title>
        <link>https://velog.io/</link>
        <description>프론트엔드 지망생</description>
        <lastBuildDate>Wed, 13 Jul 2022 08:19:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bufo_g_p.log</title>
            <url>https://velog.velcdn.com/images/bufo_g_p/profile/4cc0f1b4-bdef-4a61-ac92-864dc3536fab/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bufo_g_p.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bufo_g_p" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ 프로퍼티 어트리뷰트 ]]></title>
            <link>https://velog.io/@bufo_g_p/%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EC%96%B4%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%8A%B8</link>
            <guid>https://velog.io/@bufo_g_p/%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EC%96%B4%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%8A%B8</guid>
            <pubDate>Wed, 13 Jul 2022 08:19:36 GMT</pubDate>
            <description><![CDATA[<h2 id="내부-슬롯과-메서드">내부 슬롯과 메서드</h2>
<ul>
<li><p>자바스크립트 엔진의 구현 알고리즘을 설며하기 위한 의사 프로퍼티, 의사 메서드</p>
</li>
<li><p>형태</p>
<ul>
<li>[[~~]] 감싼 이름들이 내부 슬롯과 내부 메서드</li>
</ul>
</li>
<li><p>자바스크립트 엔진 내부 로직이기 때문에 직접적인 접근과 호출 방법은 제공 하지않고 간접적인 접근만을 허용한다 </p>
</li>
</ul>
<h2 id="프로퍼티-어트리뷰트와-프로퍼티-디스크립터-객체">프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체</h2>
<h3 id="프로퍼티-어트리뷰트">프로퍼티 어트리뷰트</h3>
<ul>
<li><p>프로퍼티를 생성할 때 프로퍼티 상태를 나타냄</p>
</li>
<li><p>프로퍼티 상태: 값:[[value]], 값의갱신여부:[[writable]], 열거가능여부:[[enumerable]], 재정의 가능 여부:[[configurable]]</p>
<h3 id="간접적인-참조">간접적인 참조</h3>
</li>
<li><p>Object.getOwnPropertyDescripter(객체의참조, 프로퍼티키) 메서드</p>
</li>
<li><p>프로퍼티 디스크립터 객체 반환: 프로퍼티 어트리뷰트 정보 제공, 정의되지 않았다면 undefined 반환</p>
</li>
<li><p>Object.getOwnPropertyDescripters 메서드는 모든 프로퍼티의 프로퍼티 어트리뷰트 정보를 제공</p>
</li>
</ul>
<h2 id="데이터-프로퍼티와-접근자-프로퍼티">데이터 프로퍼티와 접근자 프로퍼티</h2>
<ul>
<li>데이터 프로퍼티: 키와 값으로 구성된 일반적인 프로퍼티</li>
<li>접근자 프로퍼티: 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출 <h3 id="데이터-프로퍼티">데이터 프로퍼티</h3>
</li>
<li>프로퍼티 어트리뷰트 <pre><code>[[value]] value: 프로퍼티 키를 통해 값에 접근하면 반환되는
               변경하면 [[value]] 재할당
               없으면 동적 생성하고 [[value]]에 값 저장
[[writable]] writable: 값의 변경 가능 여부(불리언값), false일 경우 읽기전용 프로퍼티
[[enumerable]] enumerable: 열거 가능 여부(불리언값), false 열거 불가능
[[configurable]] configurable: 재정의 가능 여부(불리언값), false 삭제, 프로퍼티 어트리뷰트 값 변경 불가 
                      [[writable]]이 true이면 [[value]]의 변경과 [[writable]]을 false로 변경 허용</code></pre><h3 id="접근자-프로퍼티">접근자 프로퍼티</h3>
<pre><code>[[get]], get: 값을 읽을 때 호출되는 접근자 함수 
            getter함수 호출 -&gt; 프로퍼티 값 반환
[[set]], set: 값의 저장 호출 접근자 함수
            setter함수 호출 -&gt; 프로퍼티 값 저장
[[enumerable]] enumerable
[[configurable]] configurable  동일</code></pre><pre><code class="language-javascript">const person = {
firstName: &#39;Ungmo&#39;,
lastName: &#39;lee&#39;,
</code></pre>
</li>
</ul>
<p>// get동작
// 프로퍼티 키의 유효성 체크
// 프로토타입 테입에서 프로퍼티 검색
// 데이터, 접근자 프로퍼티인지 확인
// getter 함수를 호출하고 그 값 반환 
  get fullName(){
      return `${this.firstName} ${this.lastName}&#39;;
  },
  set fullName(){
     [this.firstName, this.lastName] = name.split(&#39; &#39;);
  }
};</p>
<pre><code>## 프로퍼티 정의
- 새로운 프로퍼티를 추가 하면서 프로퍼티 어트리뷰트를 명시적 정의, 기존 프로퍼티 어트리뷰트 재정의 </code></pre><p>Object.defineProperty(객체의 참조, 프로퍼티키, 디스크립터 객체(프로퍼티 어트리뷰트 값))
Object.defineProperties: 여러 개 정의</p>
<p>//프로퍼티 디스크립터 객채의 기본 값
undefined(value, get, set)
false(writable, enumerable, configurable)</p>
<pre><code>## 객체 변경 방지
- 확장금지
  - 프로퍼티 추가 금지
  - Object.preventExtensions 메서드 
  - Object.isExtensible 메서드로 확인
- 객체밀봉
  - 프로퍼티 추가 및 삭제와 재정의 금지, 읽기 쓰기만 가능
  - Object.seal 메서드
  - Object.isSealed 메서드로 확인
- 객체동결
  - 추가및 삭제와 재정의 금지, 읽기만 가능
  - Object.freeze 메서드
  - Object.isFrozen 메서드로 확인
- 불변객체
  - 위의 것들은 얕은 변경방지로 중첩 객체에 영향을 주지 않는다
  - 재귀적으로 해야 전체적으로 가능하다 </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[let, const 키워드와 블록 레벨 스코프]]></title>
            <link>https://velog.io/@bufo_g_p/let-const-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%99%80-%EB%B8%94%EB%A1%9D-%EB%A0%88%EB%B2%A8-%EC%8A%A4%EC%BD%94%ED%94%84</link>
            <guid>https://velog.io/@bufo_g_p/let-const-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%99%80-%EB%B8%94%EB%A1%9D-%EB%A0%88%EB%B2%A8-%EC%8A%A4%EC%BD%94%ED%94%84</guid>
            <pubDate>Tue, 12 Jul 2022 04:46:01 GMT</pubDate>
            <description><![CDATA[<h2 id="var-키워드로-선언한-변수의-문제점">var 키워드로 선언한 변수의 문제점</h2>
<h3 id="변수중복선언-허용">변수중복선언 허용</h3>
<ul>
<li>중복이 가능<pre><code class="language-javascript">  var a= 50;
  var b =3;
  var b; // 초기화가 없으면 무시 됨 
  var a =100;
  console.log(a,b);//100, 3</code></pre>
<h3 id="함수-레벨-스코프">함수 레벨 스코프</h3>
</li>
<li>함수 코드 블록만 지역 변수로 인정 <pre><code class="language-javascript">for(var a =0; a&lt;n; a++){} // a는 전역변수</code></pre>
<h3 id="변수-호이스팅">변수 호이스팅</h3>
</li>
<li>var 키워드는 undefined로 초기화 된 상태에서 호이스팅이 가능하다</li>
<li>가독성이 떨어지며 쓸데없다 </li>
</ul>
<h2 id="let-키워드">let 키워드</h2>
<h3 id="변수중복선언-금지">변수중복선언 금지</h3>
<ul>
<li>문법 에러<h3 id="블록-레벨-스코프">블록 레벨 스코프</h3>
</li>
<li>모든 코드 블록을 지역 스코프로 인정 <h3 id="변수-호이스팅-1">변수 호이스팅</h3>
</li>
<li>var는 선언과 초기화가 한번에 발생 </li>
<li>let은 선언, 초기화 분리 진행 <ul>
<li>런타임 이전에 선언되지만 초기화는 선언문에 도달했을 때 실행(일시적 사각지대)</li>
<li>선언문 이전 참조시 에러 발생 <pre><code class="language-javascript">console.log(a); //undefined 
var a = 20;
</code></pre>
</li>
</ul>
</li>
</ul>
<p>console.log(a); //error 
let a = 30;</p>
<p>```</p>
<h3 id="전역객체와-let">전역객체와 let</h3>
<ul>
<li>var -&gt; 전역객체 window의 프로퍼티</li>
<li>let -&gt; 전역객체의 프로퍼티가 아님 -&gt; 보이지 않는 개념적인 블록 내에 존재</li>
</ul>
<h2 id="const-키워드">const 키워드</h2>
<ul>
<li>상수의 선언<h3 id="선언과-초기화">선언과 초기화</h3>
</li>
<li>선언과 동시에 초기화 해야한다</li>
<li>블록 레벨 스코프, let과 같이 변수 호이스팅이 발생하지 않는 것처럼 동작<h3 id="재할당-금지">재할당 금지</h3>
</li>
<li>상수이기 때문에<h3 id="상수">상수</h3>
</li>
<li>상태 유지와 가독성, 유지보수의 편의를 위해 적극적으로 활용</li>
<li>잘 변하지 않으며 그 값이 의미하는 바를 시사할 수 있다</li>
<li>대문자로 이름 설정, 단어가 많으면 _ 사용 <h3 id="const-키워드와-객체">const 키워드와 객체</h3>
</li>
<li>참조 값은 변경되지 않지만 재할당 없이 값을 변경할 수 있기 때문에 값은 변경이 가능하다 </li>
</ul>
<h2 id="var-vs-let-vs-const">var vs let vs const</h2>
<ul>
<li>let -&gt; 재할당</li>
<li>const -&gt; 고정 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[전역변수의 문제점]]></title>
            <link>https://velog.io/@bufo_g_p/%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90</link>
            <guid>https://velog.io/@bufo_g_p/%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90</guid>
            <pubDate>Tue, 12 Jul 2022 04:30:52 GMT</pubDate>
            <description><![CDATA[<h2 id="변수의-생명주기">변수의 생명주기</h2>
<h3 id="지역변수의-생명주기">지역변수의 생명주기</h3>
<ul>
<li>함수 생명 주기<ul>
<li>생명주기: 참조하고 있는지 아닌지의 여부에 따라 결정된다</li>
</ul>
</li>
<li>필요성 <ul>
<li>생명주기가 없다면 한번 선언된 변수는 종료 이전까지 영원히 메모리 공간을 점유<h3 id="전역변수의-생명주기">전역변수의 생명주기</h3>
</li>
</ul>
</li>
<li>전역객체의 생명주기와 같다 <ul>
<li>전역객체: 코드 실행 전에 자바스크립트 엔진에 의해 가장 먼저 생성되는 객체(window)<h2 id="전역변수의-문제점">전역변수의 문제점</h2>
<h3 id="암묵적-결합">암묵적 결합</h3>
</li>
<li>모든 코드가 전역변수를 참조하고 변경 허용</li>
<li>가독성이 나빠짐</li>
<li>의도치 않게 상태 변경<h3 id="긴-생명주기">긴 생명주기</h3>
</li>
</ul>
</li>
<li>메모리 리소스 오래 소비<h3 id="스코프체인-상에서-종점에-존재">스코프체인 상에서 종점에 존재</h3>
</li>
<li>검색 속도가 가장 느리다<h3 id="네임-스페이스-오염">네임 스페이스 오염</h3>
</li>
<li>파일이 분리되어 있다 해도 하나의 전역 스코프를 공유</li>
<li>이름이 같아 예상치 못 한 결과를 초래한다<h2 id="전역-변수의-사용을-억제하는-방법">전역 변수의 사용을 억제하는 방법</h2>
<h3 id="즉시-실행-함수">즉시 실행 함수</h3>
</li>
<li>함수 정의와 동시에 호출되며 단 한번만 호출 </li>
<li>모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 실행 함수의 지역변수<pre><code class="language-javascript">(function(){
 let a=3;
}());</code></pre>
<h3 id="네임-스페이스-객체">네임 스페이스 객체</h3>
</li>
<li>전역변수처럼 사용하고 싶은 변수를 프로퍼티로 추가</li>
<li>객체를 프로퍼티로 추가해서 계층적으로 구성할 수 있다</li>
<li>네임 스페이스 객체 자체가 전역변수에 할당되므로 유용하지 않다<pre><code class="language-javascript">let name ={};
name.person ={name:&#39;lee&#39;};</code></pre>
<h3 id="모듈패턴">모듈패턴</h3>
</li>
<li>클래스를 모방해서 관련있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈형성 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스코프]]></title>
            <link>https://velog.io/@bufo_g_p/%EC%8A%A4%EC%BD%94%ED%94%84</link>
            <guid>https://velog.io/@bufo_g_p/%EC%8A%A4%EC%BD%94%ED%94%84</guid>
            <pubDate>Tue, 12 Jul 2022 04:13:59 GMT</pubDate>
            <description><![CDATA[<h2 id="스코프">스코프</h2>
<ul>
<li><p>스코프 = 식별자 유효범위</p>
<ul>
<li>모든 식별자는 자신이 선언된 위치에 따라 유효 범위가 결정된다 </li>
<li>폴더와 같은 역할을 수행(위치가 서로 다르기 때문에 같은 이름이여도 상관이 없다)<h2 id="스코프의-종류">스코프의 종류</h2>
<h3 id="전역과-전역스코프">전역과 전역스코프</h3>
</li>
</ul>
</li>
<li><p>어디서든지 참조 가능</p>
</li>
<li><p>전역: 전역스코프 형성</p>
</li>
<li><p>전역변수: 전역스코프의 변수</p>
<h3 id="지역과-지역스코프">지역과 지역스코프</h3>
</li>
<li><p>var 태그 함수 몸체 내부(함수레벨스코프)</p>
</li>
<li><p>let, const 태그 블록 단위(블록레벨스코프)</p>
<ul>
<li><p>var는 함수 내부를 제외하면 모든 변수가 전역변수</p>
</li>
<li><p>let, const 모든 블록 단위안의 변수는 지역변수</p>
<pre><code class="language-javascript">//var
function a(){
    var b=0; // 지역변수
}
for(var a=0; ;) // a 전역변수

//let const
function b(){
    let c=0; //지역변수
}
for(let b=0; ;)// 지역변수</code></pre>
</li>
</ul>
</li>
<li><p>지역: 지역스코프 형성</p>
</li>
<li><p>지역변수: 지역스코프의 변수</p>
</li>
<li><p>지역변수는 자신의 지역스코프와 하위 지역스코프에서 유효</p>
</li>
</ul>
<h2 id="스코프체인">스코프체인</h2>
<ul>
<li><p>스코프가 함수의 중첩에 의해 계층적구조를 갖는 것 </p>
</li>
<li><p>스코프의 계층: 스코프체인</p>
</li>
<li><p>계층 </p>
<ul>
<li><p>inner 지역스코프 -&gt; outer 지역스코프 -&gt; 전역스코프</p>
</li>
<li><p>모든 지역 스코프의 최상위는 전역스코프이다 </p>
<pre><code class="language-javascript">// inner 지역스코프에서 변수 x를 찾음 없다면
// 상위스코프로 이동하며 찾는다 
// 전역변수로 구현이 되있다면 그만큼이 시간이 소비된다

//전역
let x =3;
//outer 지역스코프
function a(){
//inner 지역스코프
 function b(){
   console.log(x); 
 }
}</code></pre>
<h2 id="렉시컬-스코프">렉시컬 스코프</h2>
</li>
</ul>
</li>
<li><p>동적스코프 </p>
<ul>
<li>함수를 어디서 호출했는지에 따라 상위 스코프가 결정</li>
</ul>
</li>
<li><p>렉시컬스코프(정적스코프)</p>
<ul>
<li>함수 정의가 평가되는 시점에 상위 스코프를 결정</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수]]></title>
            <link>https://velog.io/@bufo_g_p/%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@bufo_g_p/%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 11 Jul 2022 05:39:25 GMT</pubDate>
            <description><![CDATA[<h2 id="함수">함수</h2>
<ul>
<li><p>일련의 과정을 하나의 실행 단위로 정의</p>
<pre><code class="language-javascript">  function add(x,y){
       return x+y; 
  } // 코드블록이기 때문에 ;생략 </code></pre>
<h3 id="함수-리터럴">함수 리터럴</h3>
</li>
<li><p>객체타입의 값이기 때문에 가능</p>
<ul>
<li>객체타입의 값(?) <ul>
<li>원시타입과 달리 식별자가 함수 객체의 주소 값을 참조하기 때문에<pre><code class="language-javascript">//add 이름-&gt; 식별자, 몸체 내에서만 사용 가능 
// 이름이 있다 -&gt; 기명함수
// 없다 -&gt; 익명함수
var a = function add(x,y){
return x+y;
};  // 값이므로 ;을 붙임</code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li><p>일반객체와 다른점</p>
<ul>
<li>객체는 호출이 안되지만 함수는 호출 가능 <h2 id="함수의-정의">함수의 정의</h2>
</li>
<li>함수 선언문이 평가될 때 함수 이름과 동일한 식별자가 암묵적으로 생성되고 함수 객체 할당<pre><code class="language-javascript">// 1. 함수 평가: 함수와 동일한 이름의 식별자 생성
// 2. 함수 객체 할당: 함수 객체가 들어있는 메모리의 주소를 동일한 이름의 식별자가 참조한다
function a(){
~~~~~~
}</code></pre>
<h3 id="함수-선언문">함수 선언문</h3>
</li>
</ul>
</li>
<li><p>함수리터럴과 형태가 동일</p>
<pre><code class="language-javascript">  //선언문
  function a(){
      ~~
  }

  //리터럴 표현식 
  //()그룹연산자에 의해 피연사자 되어 값으로써 사용이 된다
 (function a(){});</code></pre>
<h3 id="함수-표현식">함수 표현식</h3>
</li>
<li><p>리터럴로 생성한 함수를 변수에 저장한 형태</p>
</li>
<li><p>함수는 일급객체이다 </p>
<ul>
<li>값으로써 사용이 가능한 객체 </li>
</ul>
</li>
<li><p>함수리터럴은 이름을 생략하는 익명함수 형태가 일반적이다</p>
<ul>
<li>변수에 할당되는 값이므로 식별자가 임으로 생성되지않는다 <ul>
<li>즉, 함수 내부에서만 사용이 가능한 식별자를 쓸 필요가 없다<pre><code class="language-javascript">var a = function(){};</code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li><p>차이점 </p>
<ul>
<li>선언문: 표현식이 아닌 문</li>
<li>표현식: 표현식인 문<h3 id="정리">정리</h3>
<blockquote>
<p>함수리터럴: 값으로써의 함수
선언문: 기명함수, 값이 아닌 문
표현식: 함수리터럴을 변수에 저장해서 사용, 값인 문</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="함수생성-시점과-함수-호이스팅">함수생성 시점과 함수 호이스팅</h3>
<ul>
<li><p>선언문 </p>
<ul>
<li><p>런타임 이전에 생성</p>
<ul>
<li>함수 객체 생성, 식별자 암묵적으로 생성, 함수 객체 주소 값 할당 </li>
</ul>
</li>
<li><p>호이스팅 </p>
<ul>
<li>호출이 어디서든 가능하다</li>
<li>런타임 이전에 이미 함수 객체가 생성되었기 때문에 가능하다</li>
</ul>
</li>
<li><p>변수 호이스팅과의 차이점</p>
<ul>
<li>변수: undefined로 초기화만 이루어짐 </li>
<li>함수: 함수 객체의 주소가 할당된 상태 <pre><code class="language-javascript">console.log(a()); // 1
console.log(b); // undefined
</code></pre>
</li>
</ul>
<p>// 런타임 이전에 생성및 할당이 이루어짐
function a(){</p>
<pre><code>return 1;</code></pre><p>}
// 런타임 이전에 생성되고 undefined로 초기화된 상태
let b = 3;
```</p>
</li>
</ul>
</li>
<li><p>표현식 </p>
<ul>
<li>변수 호이스팅이 발생 </li>
<li>변수에 할당되는 형태이기 때문에<pre><code class="language-javascript">// 변수 a 생성
 // undefined로 초기화
console.log(a()) // undefined 
var a  = function(){~~~~};</code></pre>
</li>
</ul>
</li>
<li><p>생성자함수</p>
<ul>
<li>객체를 생성하는 함수</li>
<li>함수 생산으로는 일반적으로 사용하지않음 <pre><code class="language-javascript">var a = new function(~~~);</code></pre>
</li>
</ul>
</li>
<li><p>화살표 함수</p>
<ul>
<li>function 키워드 대신 =&gt; 사용하여 간략적</li>
<li>항상 익명함수</li>
<li>내부 동작도 간략<ul>
<li>생성자 함수로 사용할 수 없음 </li>
<li>this 바인딩 방식이 다름</li>
<li>prototype, arguments가 없음<pre><code class="language-javascript">const a = (x,y) =&gt;x+y;
console.log(a(2,5))  // 7</code></pre>
<h2 id="함수호출">함수호출</h2>
<h3 id="매개변수와-인수">매개변수와 인수</h3>
</li>
</ul>
</li>
<li>함수를 실행하기 위해 필요한 값을 함수 외부에서 내부로 전달 </li>
<li>함수호출 -&gt; 매개변수생성(undefined초기화) -&gt; 인수할당 </li>
<li>인수 개수를 체크하지않음<ul>
<li>부족하면 undefined의 값으로 사용 </li>
<li>많으면 argument객체의 프로퍼티로 보관<pre><code class="language-javascript">function a (매개변수){}
a(인수);</code></pre>
<h3 id="인수확인">인수확인</h3>
</li>
</ul>
</li>
</ul>
</li>
<li><p>문제점 </p>
<ul>
<li>타입이 정적으로 정의되지 않음 </li>
<li>개수를 확인하지 않는다</li>
</ul>
</li>
<li><p>해결</p>
<ul>
<li>매개변수 기본값 설정<ul>
<li>undefined로 사용되지 않게 하려고</li>
</ul>
</li>
<li>타입스크립트와 같은 정적 타입 사용<h3 id="매개변수-최대개수">매개변수 최대개수</h3>
</li>
</ul>
</li>
<li><p>문제점</p>
<ul>
<li>많을수록 이해하기 복잡 </li>
<li>함수는 한가지의 일을 수행</li>
<li>3개를 권장 넘을경우 객체에 담아 전달<h3 id="반환문">반환문</h3>
</li>
</ul>
</li>
<li><p>return키워드 + 표현식(반환값)</p>
</li>
<li><p>값 생략(undefined 반환)</p>
</li>
<li><p>역할 </p>
<ul>
<li>결과를 함수 외부에 반환 </li>
<li>함수의 실행 종료<h2 id="참조에-의한-전달과-외부-상태의-변경">참조에 의한 전달과 외부 상태의 변경</h2>
</li>
</ul>
</li>
<li><p>매개변수 인수의 타입에 따라 방식이 달라짐 </p>
<ul>
<li><p>원시값: 값의 복사</p>
<ul>
<li>변경 불가능한 값 -&gt; 재할당을 통해 할당</li>
</ul>
</li>
<li><p>객체: 주소값의 전달</p>
<ul>
<li>참조하여 변경이 가능 </li>
<li>상태의 추적이 어려움 </li>
<li>순수함수를 사용<ul>
<li>외부상태를 변경하지 않고 외부상태에 영향을 받지않는 함수 <pre><code class="language-javascript"></code></pre>
</li>
</ul>
</li>
</ul>
<p>let a = 1;
const b ={</p>
<pre><code>c=2</code></pre><p>};
// 원시타입 = 1이 다른 메모리에 재할당 된 후 변수에 할당
// 객체 = 참조값인 주소 값을 전달하기 때문에 값에 직접적인 접근이 가능
// 객체는 불변성의 특성을 갖지 않는다 
function c(a,b){</p>
<pre><code>a=3;
  b.c =4;</code></pre><p>}
c(a,b);
console.log(a,b.c); //1, 4
```</p>
<h2 id="다양한-함수의-형태">다양한 함수의 형태</h2>
<h3 id="즉시-실행-함수">즉시 실행 함수</h3>
</li>
<li><p>정의와 동시에 호출</p>
</li>
<li><p>단 한 번만 호출</p>
</li>
<li><p>익명 함수</p>
<pre><code class="language-javascript">(function(~~~){}());</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="재귀함수">재귀함수</h3>
<ul>
<li><p>자기자신을 호출하는 것 </p>
<h3 id="중첩함수내부함수">중첩함수(내부함수)</h3>
</li>
<li><p>함수내부에서 정의</p>
</li>
<li><p>헬퍼함수: 외부함수를 돕는 역할</p>
</li>
<li><p>외부함수: 중첩 함수를 포함</p>
<pre><code class="language-javascript">  function outer(){
    function inner(){
    }
   inner();      
  }
  outer();</code></pre>
<h3 id="콜백함수">콜백함수</h3>
</li>
<li><p>인수로 함수가 전달된 것 </p>
</li>
<li><p>교차함수: 함수의 외부에서 콜백함수를 전달받은 함수</p>
</li>
<li><p>공통 로직을 정의 경우에 따라 변화는 로직은 함수 외부에서 함수 내부로 전달</p>
<ul>
<li><p>반복적으로 사용되는 부분은 따로 정의하고 수행에 따라 값이 달라지는 함수들은 밖에서 정의한다 </p>
<pre><code class="language-javascript">function repeat(n,f){
    for(let i =0; i&lt;n; i++){
        f(i);
    }
}
var logAll = function(i){
    console.log(i);
};

repeat(5,logAll);</code></pre>
</li>
</ul>
</li>
<li><p>고차함수 내부에만 호출된다면 익명 함수 리터럴로 정의</p>
</li>
<li><p>고차함수 호출 때마다 생성 </p>
<pre><code class="language-javascript">  repeat(5, function(i){
         if(i%2) console.log(i);
  });</code></pre>
</li>
<li><p>다른 곳에서도 사용이 된다면 외부에 정의</p>
</li>
<li><p>생성은 한번 -&gt; 고차함수가 호출 될 때마다 콜백 함수 생성</p>
</li>
</ul>
<h3 id="순수함수-비순수함수">순수함수 비순수함수</h3>
<ul>
<li>순수함수<ul>
<li>부수 효과 없는 함수: 외부 상태에 의존하거나 변경 하지 않음</li>
</ul>
</li>
<li>비순수함수<ul>
<li>부수 효과가 있는 함수: 외부 상태 의존, 변경</li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">let count =0;
 //순수함수
function increaseA(n){ return ++n;}
//비순수함수
function increaseB(){ return ++count;}

// 재할당 반환
count = increaseA(count);
// 변경
increaseB();</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[11장 원시값과 객체의 비교]]></title>
            <link>https://velog.io/@bufo_g_p/11%EC%9E%A5-%EC%9B%90%EC%8B%9C%EA%B0%92%EA%B3%BC-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@bufo_g_p/11%EC%9E%A5-%EC%9B%90%EC%8B%9C%EA%B0%92%EA%B3%BC-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Tue, 21 Jun 2022 06:07:02 GMT</pubDate>
            <description><![CDATA[<h2 id="원시값">원시값</h2>
<ul>
<li>변경 불가능한 값 <ul>
<li>한번 생성된 원시값은 읽기전용 값으로 변경이 불가능</li>
<li>값 변경 방식<ul>
<li>불변성<ul>
<li>새로운 메모리에 값을 저장하고 이 주소값을 식별자에 할당<pre><code class="language-javascript">// a -&gt; undefined 주소값 할당 
// a -&gt; 30의 주소값 할당 
// a -&gt; 40의 주소값 할당 
var a = 30;
a= 40;</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>문자열과 불변성 <ul>
<li>1개의 문자는 2바이트의 메모리 공간을 갖음 <ul>
<li>문자의 갯수가 늘어날 수록 크기가 늘어남</li>
</ul>
</li>
<li>문자열 타입 -&gt; 원시타입</li>
<li>유사배열객체<ul>
<li>배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖음</li>
<li>하지만 문자열 타입은 원시타입이므로 값을 직접적으로 변경할 수 없다<pre><code class="language-javascript">var s = &quot;string&quot;;
s = &quot;Hello&quot;;
console.log(s[0]); // H
s[0] = &#39;a&#39;; //  변경되지않음
console.log(s) // Hello</code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li>값에 의한 전달<pre><code class="language-javascript">  // s는 값의 표현식으로 인식 0
  // 0은 새로운 메모리에 저장
  // 이를 a에 할당 
  var s = 0 ;
  var a = s ; </code></pre>
<h2 id="객체">객체</h2>
</li>
<li>변경 가능한 값 <ul>
<li>참조 타입의 값</li>
<li>식별자는 참조값을 값으로 갖는다 이를 참조하여 값에 직접적으로 접근할 수 있다 <ul>
<li>참조값: 생성된 객체가 저장된 메모리 공간의 주소 </li>
<li>이를 변수가 객체를 참조하고 있다 말한다<pre><code class="language-javascript">var a = {
  age:30    
};
a -&gt; {age:30}의 주소값을 갖음 </code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li>참조에의한 전달<ul>
<li>여러개의 식별자가 하나의 객체를 공유</li>
<li>참조하고 있는 주소값을<pre><code class="language-javascript">var a = {....};
var b = a;
// 이때 서로 다른 메모리에 따로 주소값을 갖기 때문에 값에 의한 전달과 같다 
a-&gt; {...}의 주소값
b-&gt; {...}의 주소값

</code></pre>
</li>
</ul>
</li>
</ul>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[10장 객체 리터럴]]></title>
            <link>https://velog.io/@bufo_g_p/10%EC%9E%A5-%EA%B0%9D%EC%B2%B4-%EB%A6%AC%ED%84%B0%EB%9F%B4</link>
            <guid>https://velog.io/@bufo_g_p/10%EC%9E%A5-%EA%B0%9D%EC%B2%B4-%EB%A6%AC%ED%84%B0%EB%9F%B4</guid>
            <pubDate>Mon, 20 Jun 2022 00:30:35 GMT</pubDate>
            <description><![CDATA[<h2 id="객체">객체</h2>
<ul>
<li><p>프로퍼티의 집합 </p>
<ul>
<li>키 : 값</li>
</ul>
</li>
<li><p>함수프로퍼티 = 메서드</p>
<pre><code class="language-javascript">  var person = {
    last: 20,
    plus(){
        this.last = this.last+1;
    }
  };</code></pre>
<h2 id="객체-생성">객체 생성</h2>
</li>
<li><p>new 생성자 함수</p>
<ul>
<li><p>인스턴스 생성 방식</p>
<ul>
<li>인스턴스: 객체가 메모리에 저장되어 실제로 존재되어 지는 상태<pre><code class="language-javascript">function Person() ={
  a:1
}
</code></pre>
</li>
</ul>
<p>var personOne = new Person();</p>
</li>
</ul>
</li>
</ul>
<pre><code>- 객체 리터럴
  - 리터럴: 약속된 기호를 사용하여 값을 생성하는 표기법 
  ```javascript
    // 블록이 아닌 평가식이기 때문에 ; 사용
    var name = {};</code></pre><h2 id="객체-접근">객체 접근</h2>
<ul>
<li><p>대괄호</p>
<ul>
<li>유효한 이름이 아닐 때 사용, 키의 이름이 숫자 일 경우 &#39;&#39;없이 사용가능</li>
</ul>
</li>
<li><p>마침표 표기법 </p>
<ul>
<li>일반적으로 사용 <pre><code class="language-javascript">var person = {
   a:3,
    1:1,
    //자바스크립트에서 사용할 수 있는 표현식이 아닐경우 &#39;&#39;필요 
// pre-number는 pre, number 식별자의 -연산으로 인식
    &#39;pre-number&#39;:23
}
console.log(name[&#39;pre-number&#39;]); // 23
console.log(name[1]);    // 1 
console.log(name.a);   // 1 </code></pre>
<h2 id="프로퍼티-값-편집">프로퍼티 값 편집</h2>
</li>
<li>값 갱신<pre><code class="language-javascript">person.a = 4;
console.log(person.a); //4</code></pre>
</li>
<li>동적생성<pre><code class="language-javascript">person.b = 3;
console.log(person.b); //3</code></pre>
</li>
<li>삭제<pre><code class="language-javascript">delete person.b;
console.log(person); //{a:&#39;4&#39;,~~~}</code></pre>
<h2 id="프로퍼티-축약">프로퍼티 축약</h2>
<pre><code class="language-javascript">var a=1,b=2;
</code></pre>
</li>
</ul>
<p>var c ={
// a:a, b:b 키와 값으로 사용되는 변수의 이름이 같을 경우 생략가능<br>  a,b
}</p>
</li>
</ul>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[6,7,8,9 장 정리]]></title>
            <link>https://velog.io/@bufo_g_p/6789-%EC%9E%A5-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@bufo_g_p/6789-%EC%9E%A5-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 30 May 2022 02:08:56 GMT</pubDate>
            <description><![CDATA[<h2 id="6장">6장</h2>
<h3 id="템플릿-리터럴">템플릿 리터럴</h3>
<ul>
<li>백틱을 사용하여 표현</li>
<li>런타임에 일반 문자열로 변환</li>
<li>이스케이프 시퀀스를 사용하여 줄바꿈을 수행 → 템플릿 리터럴은 이스케이프 시퀀스를 사용하지 않고도 적용이 가능하다</li>
</ul>
<pre><code class="language-javascript">// 일반
var template = &#39;&lt;ul&gt;\n\t&lt;li&gt;
&lt;a href =&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;\n&lt;ul&gt;&#39;;

// 템플릿 리터럴
var template= `&lt;ul&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;`;</code></pre>
<h3 id="템플릿-리터럴-표현식-삽입">템플릿 리터럴 표현식 삽입</h3>
<ul>
<li><p>결과가 문자열이 아니여도 강제로 변환 </p>
<pre><code>console.log(`1+2 = ${1+2}`) // 1+2 = ${1+2}
// &#39;1+2 = ${1+2}&#39; </code></pre><h2 id="7장">7장</h2>
<h3 id="비교-연산자">비교 연산자</h3>
</li>
<li><p>동등비교</p>
<ul>
<li>==</li>
<li>데이터 타입을 강제로 형 변환하여 똑같은 상태에서 값을 비교<pre><code class="language-javascript">var a = 3;
var b = &#39;3&#39;;
</code></pre>
</li>
</ul>
<p>console.log(a==b); //true
// b-&gt; int -&gt; 3
```</p>
</li>
<li><p>일치비교</p>
<ul>
<li>===</li>
<li>데이터 타입을 그대로 두고 비쇼<pre><code class="language-javascript">console.log(a==b); //false</code></pre>
</li>
</ul>
</li>
<li><p>Obejct.is</p>
<ul>
<li>NaN이나 -0, +0에 대한 정확한 비교를 위해 사용<pre><code class="language-javascript">Object.is(a,b); </code></pre>
<h3 id="지수-연산자">지수 연산자</h3>
</li>
</ul>
</li>
<li><p>5 ** 3</p>
<ul>
<li>밑 = 5 </li>
<li>지수 = 3</li>
</ul>
</li>
<li><p>(-4) ** 3</p>
<ul>
<li>음수를 밑으로 사용할떄</li>
</ul>
</li>
<li><p>Math.pow()</p>
<ul>
<li>여러번 사용할 때 가독성을 높일 때 이용 </li>
</ul>
</li>
</ul>
<h2 id="8장">8장</h2>
<h3 id="레이블-문">레이블 문</h3>
<ul>
<li>블록문에 식별자를 붙인 형태</li>
<li>흐름을 제어할 때 사용<ul>
<li>흐름을 방해할 수 있기 때문에 잘 사용하지 않는다 <pre><code class="language-javascript">//보통 
a{
~~~~~~
break a;
}</code></pre>
<h2 id="9장">9장</h2>
<h3 id="옵셔널-체이닝-연산자">옵셔널 체이닝 연산자</h3>
</li>
<li>?.</li>
</ul>
</li>
<li>좌항 피연사자의 값이 null undefined일 경우 undefined반환 아닐경우 우항 프로퍼티 반환</li>
<li>객체를 가리키기를 기대하는 변수가 null인지 undefined인지 확익할 때 유용</li>
<li>논리 연사자를 사용할 경우 false를 대체할 수 있는 표현식일 경우 null undefined가 아님에도 프로퍼티를 참조할 수 없다<pre><code class="language-javascript">// 옵셔널 체이닝 연산자
let a = null;
let b = a?.b; // undefined
</code></pre>
</li>
</ul>
<p>let c = &#39;&#39;;
let d =  c?.length; // 0 </p>
<p>//논리 연산
let e = c &amp;&amp; c.length; // &#39;&#39; 
// 단축평가로 c=&#39;&#39;할당된다</p>
<pre><code>### null 병합 연산자
- ??
  - 좌항의 피연사자가 null undefined 일 경우 우항 피연사자를 반환 
```javascript
    var foo = null ?? &#39;dede&#39;;
    // dede</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[props]]></title>
            <link>https://velog.io/@bufo_g_p/props</link>
            <guid>https://velog.io/@bufo_g_p/props</guid>
            <pubDate>Wed, 27 Apr 2022 05:57:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>하나의 컴포넌트에 선언되어 있는 변수, 객체 등의 값들을 다른 컴포넌트에게 전달할 수 있게 해준다</p>
</blockquote>
<pre><code class="language-jsx">  import React, {useState} from &#39;react&#39;;

  function App(){

    let title = &#39;이번달&#39;;
    //destructuring [&#39;1월&#39;,&#39;2월&#39;,&#39;3월&#39;],setState(?); 
    let [day, setDay] = useState([&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;]);

    return(
           // props로 전달할 값 설정
         &lt;Prc title={title} day ={day} color=&#39;red&#39; /&gt;   
      );
  }

// 객체의 프로퍼티처럼 사용
 function Prc(props){
      &lt;div&gt;
     &lt;h1 style ={[color=&#39;red&#39;]}&gt;props.title&lt;/h1&gt;
     &lt;span&gt;props.day[0]&lt;/span&gt;
    &lt;/div&gt;
 }
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[불변성]]></title>
            <link>https://velog.io/@bufo_g_p/%EB%B6%88%EB%B3%80%EC%84%B1</link>
            <guid>https://velog.io/@bufo_g_p/%EB%B6%88%EB%B3%80%EC%84%B1</guid>
            <pubDate>Sat, 23 Apr 2022 11:00:33 GMT</pubDate>
            <description><![CDATA[<h2 id="불변성">불변성</h2>
<blockquote>
<p>값을 직접적으로 접근할 수 없는 것</p>
</blockquote>
<ul>
<li>원시타입에 값을 할당하는 방식으로 말할 수 있다 <ul>
<li>원시타입이란<ul>
<li>기본적으로 제공되는 Boolean, String, Number, Null, undefined, Symbol와 같은 타입을 말한다</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>예시)</p>
<pre><code class="language-javascript">var x;
x= 3;

1. var x = undefined
2. x = 3;</code></pre>
<ul>
<li><p>런타임 이전에 var x가 등록이 되고 값은 undefined로 초기화 된다</p>
<ul>
<li>렉시컬 환경의 환경 스코프에 등록이 되며 이러한 과정을 평가 과정이라 한다</li>
</ul>
</li>
<li><p>평가가 끝나고 코드가 실행되면 x에 3이 할당된다 </p>
<ul>
<li>이때 undefined가 존재하는 메모리에 직접적으로 접근하는 것이 아니라 새로운 메모리 공간에 3을 저장하고 x에 할당한다</li>
</ul>
</li>
<li><p>이에 반하여 자바스크립트 참조타입은 불변성을 제공하지 않는다</p>
</li>
</ul>
<p>예시)자바스크립트</p>
<pre><code class="language-javascript">  var array = [1,2,3];
  var abc = array;
  abc[0]= abc[0]+1;
  console.log(array,abc) // [2,2,3], [2,2,3]</code></pre>
<ul>
<li>자바스크립트는 위와 같이 두 배열이 하나의 메모리 주소를 참조하고 있기 때문에 abc의 값을 바꾸면 array의 값도 변경되어 출력된다 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[map]]></title>
            <link>https://velog.io/@bufo_g_p/map%EB%B6%88%EB%B3%80%EC%84%B1</link>
            <guid>https://velog.io/@bufo_g_p/map%EB%B6%88%EB%B3%80%EC%84%B1</guid>
            <pubDate>Sat, 23 Apr 2022 09:17:26 GMT</pubDate>
            <description><![CDATA[<h2 id="map">map</h2>
<blockquote>
<p>for 대신 사용가능한 반복문 </p>
</blockquote>
<ul>
<li>기본 형태<pre><code class="language-jsx">배열.map(function(배열데이터,인덱스 번호){})
</code></pre>
</li>
</ul>
<p>//인덱스 개수만큼 반복
// 3번 반복
{
  [a,b,c].map(function(d,n){
      console.log(d) // a,b,c
      console.log(n) //0,1,2</p>
<pre><code>  return &quot;def&quot; //배열 값을 변경 
              //[def,def,def]
              //태그 값을 넣으면 태그값이 출력</code></pre><p>  })
}</p>
<pre><code>
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[component문법]]></title>
            <link>https://velog.io/@bufo_g_p/component%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@bufo_g_p/component%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Fri, 22 Apr 2022 07:29:48 GMT</pubDate>
            <description><![CDATA[<h2 id="component-문법">Component 문법</h2>
<blockquote>
<p>html ui를 하나의 function 처럼 만들어서 저장하는 형태</p>
</blockquote>
<ul>
<li>기본적으로 있는 App도 component 문법으로 만들어졌다 </li>
<li>만드는법 <ul>
<li>아래와 같이 function 식별자 이름의 첫 글자라를 대문자로 하며 위치는 다른 함수 밖에 위치한다</li>
<li>return으로 작성할 html문을 감싼다</li>
<li>여러 개의 section을 만들지 않고 하나의 공간만을 구현</li>
</ul>
</li>
<li>사용 경우<ul>
<li>반복적으로 사용할 경우</li>
<li>큰 페이지들을 담을 경우</li>
<li>자주 변경되는 ui들을 담는다</li>
</ul>
</li>
<li>단점<ul>
<li>함수로 구분되어 있기 때문에 각 스코프에 위치해 있는 변수들을 같이 사용할 수 없다</li>
</ul>
</li>
</ul>
<pre><code class="language-jsx">//사용법
    &lt;Abc&gt;&lt;/Abc&gt;
    &lt;Abc/&gt;

   function Abc(){

    return (&lt;div&gt;
       abc
    &lt;/div&gt;)
   }

//단점
    function App(){
      let a =4;
        return(~~~~)
    }

    function Bpp(){
        return(
          &lt;div&gt;{a}&lt;/div&gt; // error
        )
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[state]]></title>
            <link>https://velog.io/@bufo_g_p/state</link>
            <guid>https://velog.io/@bufo_g_p/state</guid>
            <pubDate>Tue, 19 Apr 2022 05:38:00 GMT</pubDate>
            <description><![CDATA[<h2 id="state-문법">State 문법</h2>
<ul>
<li><p>기능은 변수와 같다 </p>
<pre><code class="language-jsx">import React, {useState} from &#39;react&#39;;
// 내장 함수를 사용하겠다 선언 
// useState() = state를 하나 만들어주는 함수 
//배열이나 객체도 저장이 가능하다 = ([]) ({})
// 인덱스 번호로 사용이 가능하다 useState[0]
useState(&#39;저장할 데이터&#39;); 
// [a,b] 자료 =&gt; a=저장할 데이터, b= 변경 데이터
//변수 지정
// destructuring 문법
// var [a,b] = [&#39;a&#39;,&#39;b&#39;]; =&gt; a=a b=b
// b= a변경 함수
let [a,b] = useState(0);
b(a+1); // a = 1 </code></pre>
</li>
<li><p>사용 이유와 목적</p>
<ul>
<li>웹 앱처럼 사용하기 위해 <ul>
<li>그냥 변수는 새로고침을 해주어야 렌더링이 되지만 state는 변경시 자동으로 렌더링된다</li>
</ul>
</li>
<li>변경이 많은 데이터나 중요한 데이터를 설정할 때 사용<h2 id="state-arrayobject-값-변경">State array/object 값 변경</h2>
</li>
</ul>
</li>
<li><p>변경 조건</p>
<ul>
<li><p>똑같은 주소를 반인딩하면 변하지 않는다</p>
</li>
<li><p>즉 아래와 같은 경우로 변경을 시도하면 똑같은 값으로 보고 변경을 수행하지 않는다</p>
<pre><code class="language-jsx">//a,b,c는 메로리의 특정한 공간에 할당
//a는 식별자로 a,b,c가 저장되어 있는
// 메모리의 주소를 참조한다
// 즉 메모리의 이름
let a = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;];
let b = a;
console.log(a==b); // true 
</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code>- 해결 법 
  - 전개구문
    - 새로운 공간에 값을 복사하여 할당하는 방식
```jsx
    b = [...a];
    console.log(a==b) //false</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JSX]]></title>
            <link>https://velog.io/@bufo_g_p/JSX-xkec38q1</link>
            <guid>https://velog.io/@bufo_g_p/JSX-xkec38q1</guid>
            <pubDate>Tue, 19 Apr 2022 05:26:30 GMT</pubDate>
            <description><![CDATA[<h2 id="jsx-문법">JSX 문법</h2>
<ol>
<li>HTML 대신 사용</li>
</ol>
<ul>
<li>class 대신 className으로 작성한다 <pre><code class="language-jsx">&lt;div className=&#39;abc&#39;&gt;&lt;div&gt;</code></pre>
</li>
</ul>
<ol start="2">
<li><p>데이터 바인딩 쉽게 가능하다</p>
<ul>
<li>원래 데이터 바인딩을 하는 경우<pre><code class="language-jsx">//html파일
&lt;div class=&#39;abc&#39;&gt;&lt;/div&gt;
//js파일
let abc =document.queryselector(&#39;.abc&#39;);
let n = 3;
abc.innerText = n;</code></pre>
</li>
</ul>
</li>
</ol>
<ul>
<li>jsx로 데이터 바인딩<ul>
<li>{}에 변수명, 함수명, 이미지 import 등 대부분 집어넣어 데이터 바인딩이 가능하다<pre><code class="language-jsx">// 바로 바인딩이 가능 
import img from &#39;./img.svg&#39;;
let n =3;
</code></pre>
</li>
</ul>
</li>
</ul>
<p>function example(){
    console.log(&#39;h&#39;);
}
<img src ={img}/> // 기존 src =&#39;./img.svg&#39;;</p>
<div>{n}</div> // 3 
<div>{example}</div> // 'h'
```
- css의 경우 object자료형으로 만들어 사용 가능하다
  - font-size 처럼 중간에(-)가 있을경우 연산자로 인식을 하기 때문에 생략하고 대문자로 이어붙여 쓴다
```jsx
let st = {color:'red',fontSize:'35rem'}; // 변수에 할당하여 사용할 수도 있다 
<div style = {{color:'red',fontSize :'35rem'}}> </div>

<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[this]]></title>
            <link>https://velog.io/@bufo_g_p/this</link>
            <guid>https://velog.io/@bufo_g_p/this</guid>
            <pubDate>Tue, 19 Apr 2022 03:39:05 GMT</pubDate>
            <description><![CDATA[<h2 id="this-필요성">this 필요성</h2>
<blockquote>
<p>객체의 동작을 나타내는 메서드는 자신이 속한 객체의 프로퍼티를 참조하고 변경할 수 있어야 한다</p>
</blockquote>
<ul>
<li>위와 같은 특성을 해결하기 위해 제공되는 자기 참조 변수<ul>
<li>자기 참조 변수 = 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 변수</li>
</ul>
</li>
</ul>
<h2 id="함수-호출-방식과-this-바인딩">함수 호출 방식과 this 바인딩</h2>
<blockquote>
<p>this 바인딩은 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다</p>
</blockquote>
<h3 id="일반-함수-호출">일반 함수 호출</h3>
<ul>
<li>this = window(전역 객체가 바인딩)</li>
<li>일반 함수로 호출될 시 모든 this는 전역 객체가 바인딩된다<pre><code class="language-javascript">function foo(){
console.log(&quot;foo&#39;s this: &quot;, this); // window
function bar(){
   console.log(&quot;bar&#39;s this: &quot;, this); //window
}
bar();
}
foo();</code></pre>
<ul>
<li>문제점</li>
<li>메서드 내에서 정의한 중첩 함수 또는 메서드에게 전달한 콜백 함수가 일반 함수로 호출될 때 this가 전역 객체를 바인딩되는 문제가 있다<ul>
<li>이런 문제는 헬퍼 함수로써의 역할을 수행하지 못하게 된다<pre><code class="language-javascript">//해결책
// this를 다른 변수에 할당하여 사용
// 다른 방법으로는 Function.prototype 메서드인 apply, call, bind를 이용하여 간접적으로 this의 바인딩을 설정하는 방법이 있다 이는 뒤에서 설명
var value = 1;
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>const obj ={
     value: 100,
      foo() {
      const that = this;</p>
<pre><code>  setTimeout(function(){
    console.log(that.value); //100
  },100);
}</code></pre><p> }
};
obj.foo();</p>
<pre><code>### 메서드 호출
- 메서드 내부의 this는 메서드를 소유한 객체가 아닌 메서드를 호출한 객체에 바인딩된다
  - 이러한 특징을 보이는 이유는 객체에 정의된 메서드 프로퍼티는 사실 프로퍼티가 함수 객체를 가리키고 있을 뿐이기 때문이다
  - 프로토타입 메서드도 똑같이 바인딩된다 
```javascript
//이유 예제
const person ={
     name: &#39;lee&#39;;
  // getname 프로퍼티 -&gt; return this.name 역할을 하는 함수 객체를 가리키고 있다(바인딩)
      getNmae() {
        return this.name;
    }

};
console.log(person.getName()); //lee

//작동 에제
const anotherPerson ={
  name:&#39;Kim&#39;;
};

anotherPerson.getName = person.getName;
//메서드를 호출하는 객체 = anotherPerson
console.log(anotherPerson.getName()); //Kim

const getName = person.getName;
//일반 함수로 호출  = window 전역 객체
console.log(getName()); //&#39;&#39;</code></pre><h3 id="생성자-함수-호출">생성자 함수 호출</h3>
<ul>
<li>생성자 함수가 생성할 인스턴스가 바인딩된다<pre><code class="language-javascript">function Circle(radius){
  this.radius = radius;
    this.getDiameter = function (){
    return 2 * this.radius;
  };
}
</code></pre>
</li>
</ul>
<p>const circle1 = new Circle(5);
const circle2 = new Circle(10);</p>
<p>console.log(circle1.getDiameter()); //10
console.log(circle2.getDiameter()); //20</p>
<pre><code>### Function.prototype. apply/call/bind 메서드에 의한 간접 호출
&gt; Function.prototype의 메서드이기 때문에 모든 함수가 상속받아 사용할 수 있다 

### apply, call 메서드
- 첫 번째 인수로 전달한 특정 객체를 호출한 함수의 this에 바인딩 하다
- 둘의 차이점은 두 번째 인수로 전달하는 인수들을 나열하는 방식에 있다
```javascript
function getThisBinding(){
    console.log(arguments);
    return this;
}

const thisArg = {a:1};
// 두 번째 인수 전달 방식이 다르다
console.log(getThisBinding.apply(thisArg, [1,2,3]));
// Arguments(3) [1,2,3]
// {a:1}
console.log(getThisBinding.call(thisArg, 1,2,3))
//Arguments(3) [1,2,3]
//{a:1}</code></pre><ul>
<li><p>대표적인 용도(배열에서 다시 볼 예정이다)</p>
<ul>
<li>Arguments 객체를 배열로 변환하여 사용할 경우<pre><code class="language-javascript">function convertArgsToArray(){
console.log(arguments);
// call == apply
// Array.prototype.slice를 인수 없이 호출하면 배열의 복사본을 생성
const arr = Array.prototype.slice.call(arguments);
</code></pre>
</li>
</ul>
<p>console.log(arr);</p>
<p>return arr;</p>
</li>
</ul>
<p>}
convertArgsToArray(1,2,3); // [1,2,3]</p>
<pre><code>### bind
- apply,call 메서드와 달리 함수를 호출하지 않고 this로 사용할 객체만 전달

```javascript
function getThisBinding(){
     return this; 
}

const thisArg = {a:1};

console.log(getThisBinding.bind(thisArg)); //getThisBinding
console.log(getThisBinding.bind(thisArg)()); // {a:1} 명시적 호출</code></pre><ul>
<li>용도<ul>
<li>위에서 이야기 했던 일반 함수의 호출의 문제점을 해결하는데 사용된다<ul>
<li>중첩 함수와 콜백 함수가 일반 함수로써 호출이 되면 this가 전역 객체에 바인딩되는 문제<pre><code class="language-javascript">const person={
name: &#39;Lee&#39;,
foo(callback){
setTimeout(callback.bind(this), 100); 
}
};
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>person.foo(function(){
  console.log(<code>Hi! my name is ${this.name}.</code>); // Hi! my name is Lee.
});</p>
<pre><code></code></pre>]]></description>
        </item>
    </channel>
</rss>