객체는 몇 가지 특수한 기능을 가진 연관 배열이다.
객체는 프로퍼티 값을 저장한다.
복잡한 서랍장 안에서 이름표를 보고 원하는 파일을 쉽게 찾듯이, 객체에서 키를 이용해 프로퍼티를 쉽게 찾을 수 있다. (추가, 삭제도 마찬가지)
빈 객체를 만드는 방법
let user = new Object(); //객체 생성자 문법
let user = {}; // '객체 리터럴' 문법
중괄호를 이용해 객체를 선언하는 것을 객체 리터럴이라고 한다.
점 표기법 : obj.property
대괄호 표기법 : obj["property"]
delete obj.prop : 프로퍼티를 삭제하고 싶을때
"key" in obj : 해당 key를 가진 프로퍼티가 객체 내에 있는지 확인할 때
for (let key in obj) : 프로퍼티를 나열할 때
const user = {
name : "john"
};
user.name = "Pete";
alert(user.name) // Pete
const
는 user
의 값을 고정하지만, 그 내용은 고정하지 않는다.
const
는 user
를 전체적으로 설정하려고 할 때만 오류가 발생한다.
지금까지는 '순수 객체'라 불리는 일반 객체에 대해 학습했다.
객체 이외에도 다양한 종류의 객체가 있다.
함수형 프로그래밍 언어에서 등장하는 보편적인 특성이다.
MDN발췌 : 클로저는 함수와 그 함수가 선언될 당시의 lexical environment의 상호관계에 따른 현상.
즉 클로저란 어떤 함수에서 선언한 변수를 참조하는 내부함수에서만 발생하는 현상을 일컫으며
외부 함수의 Lexical Environment(JS 엔진이 현재 읽고 있는 코드의 scope혹은 environment를 말한다)가 가비지 컬렉팅 되지 않는 현상을 말한다.
가비지컬렉터란(CG)? 쓰레기 수집! 메모리 관리 기법중 하나로 프로그램이 동적으로 할당했던 메모리 영역중에서 필요없게 된 영역을 해제하는 기능.
밑에 예시는 외부함수에서 변수를 선언하고, 내부함수에서 해당 변수를 참조하는 형태의 코드이다.
var outer = function () {
var a = 1;
var inner = function() {
console.log(++a);
};
inner();
};
outer();
inner
함수 내부에서는 a
를 선언하지 않았기 떄문에 값을 찾지 못하므로
지정된 상위 컨텍스트인 outer
의 LexicalEnvironment
에 접근해서 다시 a
를 찾는다.
###클로저 개념 총 정리
어떤 함수A
에서 선언한 변수 a
를 참조하는 내부함수 B
를 외부로 전달할 경우 A
의 실행 컨텍스트가 종료된 이후에도 변수 a
가 사라지지 않는 현상이다.
(외부로 전달이 곧, return만을 의미하는 것은 아니다.)
메모리 누수
개발자의 의도와는 달리, 어떤 값의 참조 카운트가 0이 되지 않아 GC(가비지 컬렉터)의 수거 대상이 되지 않는 경우에 하는 표현.
null
이나, undefined
)를 할당하면 된다.접근 권한
에는 3가지 종류가 있다.return
한다. n
개의 인자를 받는 함수에 미리 m
개의 인자만 넘겨 기억시키고,(n-m)
개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수.bind
메서드의 실행 결과가 바로 부분 적용 함수이다.참고
Symblo.for 메서드
는 전역 심볼공간에 인자로 넘어온 문자열이 이미 있으면 해당 값을 참조하고, 선언돼 있지 않으면 새로 만드는 방식.
- 어디서든 접근이 가능하고, 유일무이한 상수를 만들고자 할 때 적합함.
체인 형태
로 구성한 것.지연실행
당장 필요한 정보만 받아서 전달하고 또 정보가 들어오면 전다하는 식으로 하면 결국 마지막 인자가 넘어갈 때까지 함수 실행을 미루는 식이다. 이를 지연실행 이라고 한다.
(원하는 시점까지 지연시켰다가 실행하는 것이 요긴한 상황이라면 커링을 쓰기에 적합하다.)
클로저
란? 어떤 함수에서 선언한 변수를 참조하는 내부함수를 외부로 전달할 경우, 함수의 실행 컨텍스트가 종료된 이후에도 해당 변수가 사라지지 않는 현상return
뿐만 아니라 콜백
으로도 가능하다.