2020.09.03 Thursday
var
,let
,const
세 가지로 선언할 수 있다. 혼자 정리하는 이론
var
는 함수를 단위로 범위(스코프)를 갖는다.
함수 범위 단위로 변수를 사용할 수 있다.
let
과const
는 다른 언어와 마찬가지로{}
(블록)단위로 범위(스코프)를 갖는다.
let
은 재할당이 가능하지만const
는 상수처럼 재할당이 불가능하다.
다만 참조형 타입(배열,객체)의 안에 데이터는 변경이 가능하다.
{ a : "a"}
처럼 쉽게 선언할 수 있다. 혼자 정리하는 이론
Primitive Type(원시타입)은 메모리에 직접 값을 담는다.
반면에 Reference Type(참조타입)은 메모리에 값을 담은 주소(위치)를 담는다.
이 차이는 변수를 복사할 때, 비교할 때const
를 사용할 때 나타난다.
함수
는 객체
이다.값
이다.return
으로 반환 값을 나타내고 return
이 없으면 undefined
을 반환한다.문
뒤에는 ;(세미콜론)
를 찍지 않는다. 반면 식
뒤에는 ;(세미콜론)
를 찍는다. 식
이고 이외의 함수 선언, if문, 반복문 등이 문
이다.Higher-order Component (HOC)
는 동일한 원리를 이용한 것이다. Higher-order Component (HOC)
에 매개변수로 Component
를 넣으면 뭔가 추가된 Component
로 반환된다.혼자 정리하는 이론
일급 함수를 이용한 간단한 예시
addMaker
함수는function(b) { return a + b;}
를 반환한다. 그 반환값을 변수에 담는다. 그리고 변수는 함수를 실행하는 것처럼add2(b)
,add3(b)
이렇게 실행한다.
화살표 함수
이다. 화살표 함수
는 매개변수가 한 개일 때에는 ()
과 생략 가능하고 반환값을 표현하는 식이 한 줄일 경우 return
또한 생략 가능하다.혼자 정리하는 이론 - 화살표 함수의 특이점
this를 다른 함수처럼 사용할 수 없다.
다른 함수는 함수를 호출할 때 결정되지만 화살표 함수의 this는 함수를 정의할 때 결정된다. 즉, 화살표 함수 바깥의 this 값이 화살표 함수의 this 값이 된다.
say 함수 안에 this의 값은 전역 객체를 가리킨다. 반면에 화살표 함수 g의 this는 객체 obj를 가리킨다. 화살표 함수는 call이나 apply 메서드를 사용하여 this를 바꾸어 호출해도 this 값이 바뀌지 않는다.
arguments 가 없다.
화살표 함수 안에는 유사 배열 형태인 arguments 변수가 없다.
화살표 함수에는 arguments가 없지만 상위 함수에 arguments가 있기 때문에 ‘스코프체인’을 타고 올라가서 arguments를 출력한다.
arguments는 에러를 발생시키지만 this.name은 ‘young’를 출력한다. 하지만 화살표 함수가 아니라 일반 함수식이라면 this.name은 ‘홍대개발자’를 출력한다.
다른 함수는 함수를 호출할 때 결정되지만 화살표 함수의 this는 함수를 정의할 때 결정된다.
new 키워드를 사용할 수 없다.
const tenX = 10;
과 const tenY = () => 10;
는 결과적으로 같은 값을 갖는다.객체
는 참조타입이기 때문에 .name
값에 접근해서 직접 변경이 가능하다.(const
라고 할 지라도)생성자 함수
를 활용해 인스턴스
를 만들 수 있다. 생성자 함수
는 다른 함수와 구분하기 위해 대문자로 시작하는 이름을 명명한다.생성자 함수
를 인스턴스 생성에만 사용하도록 강제할 수는 없다. (new
사용)instanceof
를 이용해 생성자 함수
의 인스턴스
인지 확인할 수 있다. 클래스
는 생성자 함수
에 비해서 명시적이다. constructor
를 통해 명시적으로 this
를 알 수 있다. new
를 붙이지 않으면 호출이 안됨으로 생성자 함수
보다 사용할 때 명확하다. getName
함수를 만들고 이후에 this
를 바인딩 함수를 man
담아서 name
이라는 값을 볼 수 있도록 하면 값을 볼 수는 있지만 조작하긴 어렵게 만들 수 있다. this
는 함수가 실행되는 맥락에서 파악되기 때문에 바인딩하지 않을 경우 this
를 선언하지 않았기 때문에 스코프 체인
를 타고 전역 객체까지 올라간다. this
를 설정하기 위해서는 bind
, call
, apply
를 사용한다.혼자 정리하는 이론
apply
— 선택한 this와 매개변수를 사용하여 함수를 호출한다. 매개변수 - 배열
call
— 선택한 this와 매개변수를 사용하여 함수를 호출한다. 매개변수 -쉼표로 구분한 값(객체를 위한 값들)
bind
— 선택한 this와 매개변수를 적용한 새로운 함수를 반환한다.
apply
와call
의 동작은 본질적으로 같다. 차이점은 함수에 매개변수를 넘기는 방법뿐이다.apply
의 매개변수는 배열이고call
의 매개변수는 쉼표로 구분한 값의 목록이다.
foo15
를 f
에 할당하면서 매개변수 10
를 같이 할당하였다. 그래서 f
를 f()
와 같이 실행하면 10
를 반환한다. 이상한 점은 f()
가 실행되는 부분 어디에도 10
이라는 값을 찾아볼 수 없지만 결과로 10
이 나온다는 것이다. 이유는 foo15
를 f
에 할당하면서 매개변수 10
를 같이 할당된 값을 계속 갖고 있기 때문이다. 이렇게 입력된 값을 가비지 컬렉션
이 지우지 않고 기억하고 있다가 실행 시점에 값을 활용하는 것을 클로저
라고 한다.
person2
와 같은 객체는 외부에 쉽게 값을 변경할 수 있다. makePerson
함수를 만들고 클로저
를 이용하면 외부로부터 값을 안전하게 지키면서 활용할 수 있다. getAge
함수를 만들어 age
가 필요할 곳에서 활용할 수 있고, setAge
를 활용해 age
를 변경할 수 있다. 차이는 점은 setAge
안에 조건을 생성해 잘못된 값이 들어올 경우에 대비할 수 있다는 점이다. setTimeout
은 첫번째 매개변수로 받은 함수를 두번째 매개변수로 받은 시간만큼 기달렸다가 실행하는 함수이다. setTimeout
함수는 비동기적으로 실행된다. 앗싸
가 찍히고 그 이후 2초 다음에 웃싸
가 찍힌다. 콜백 함수 지옥
, 콜백 헬
이라고 한다. Promise
는 비동기 작업을 함수 안의 함수
구조 대신 체이닝 구조로 일렬로 볼 수 있게 해준다.then
을 사용하며, then
은 resolve
를 호출한다.catch
를 이용해 reject
를 호출한다.Async/await
를 이용하면 동기적인 코드처럼 작성할 수 있다.
1이 찍히고 2초 후에 2가 찍히면 해야겠다
라는 의도로 작성된 코드이다.async
로 함수를 선언하고 비동기 작업 앞에 await
를 붙이면 동기적인 코드처럼 작성할 수 있다. console.log("1")
이 실행되고 delay
함수(비동기 작업)가 실행되고 난 다음에 console.log("2")
가 실행된다. store
만들기store
은 객체
다.createStore
함수를 만들어서 store
를 만들었다.클로저
를 이용해 createStore
를 수정했다.state
를 볼 수 있도록 getstate
함수를 만들었다. store
에 있는 state
는 반드시 reducer
를 통해서 변경되도록 한다.reducer
는 매개변수로 초기 state
와 action
을 전달 받는다. action
은 type
과 변경될 값을 객체를 갖는다. action.type
을 기준으로 리턴 값을 다르게 한다.reducer
를 이용해 상태를 변경할 수 있는 dispatch
를 만들었다. dispatch
는 매개변수로 action
을 받는다. dispatch
안에서는 스코프 안에 state
와 action
를 reducer
에 넣어서 변경된 state
를 받는다. actionCreator
를 만들었다. actionCreator
는 첫번째 매개변수에는 action.type
을 넣고 두번째 매개변수에는 변경할 데이터를 객체로 넣는다. const INCREMENT = "increment";
, const RESET = "reset";
action 문자열을 상수처리를 했다.createStore
함수 안에 subscribe
함수를 만들었다.
getState
를 사용해 값을 출력하는 update
를 만든다.
store.subscribe(update)
로 변경된 state
를 출력되도록 한다.
전체 코드
리듀서를 라이브러리로만 사용하고 있었는데,
이 글을 보고 내부 로직도 이해할 수 있게 되어 좋았습니다!
우아한 테크러닝 부럽네요 :D