특정 두 가지 함수와 렉시컬환경 콤비네이션.
내부 함수에서 외부 함수에 있는 환경에 접근할 수 있는 권한을 주는 것.
자신이 생성될 때의 렉시컬 환경을 기억하는 함수다.
클로저에 의해 참조되는 외부함수의 변수를 자유변수라고 부른다.
function makeCounter() {
let count = 0;
function increase() {
count++;
console.log(count);
}
return increase;
}
const increase = makeCounter();
increase();
increase();
increase();
// 최신 JS, TS에서는 Class를 이용해서 내부 변수를 숨길 수 있고, Closure를 대신한다.
class Counter {
#count = 0;
increase() {
this.#count++;
console.log("#Counter : ", this.#count);
}
}
const counter = new Counter();
counter.increase();
Closure Q. - var와 let의 차이
function varLoop() {
const varArray = [];
//var와 let의 차이점
for (var i = 0; i < 5; i++) {
// var는 블록 스코프가 없음. 함수 스코프만 해당함.
varArray.push(function () {
console.log("var i : ", i);
});
}
return varArray; // 5 5 5 5 5반환
}
const varArray = varLoop();
varArray.forEach((func) => func());
function letLoop() {
const letArray = [];
//var와 let의 차이점
for (let i = 0; i < 5; i++) {
// let은 블럭 스코프가 있음.
letArray.push(function () {
console.log("let i : ", i); // i를 log찍는 "함수"를 letArray 배열에 넣음.
});
}
return letArray; // 0 1 2 3 4 반환
}
const letArray = letLoop();
letArray.forEach((func) => func()); // i를 log찍는 "함수"를 letArray 배열에 넣음. 그래서 파라미터로 func()을 넣어줌.
자바스크립트에서의 This는 문맥에 따라 This가 가리키는 것이 달라짐.
C#
, Java
에서는 코드상에서 this 바인딩이 정적
으로 결정된다.
하지만 JS
, TS
런타임 상에서 this 바인딩은 동적
으로 결정된다.
이 때문에 예상하지 못한 코드 실행결과가 나올 수 있음.
this 바인딩
자바, C#, C++
대부분의 객체지향 프로그래밍 언어에서는 this는 항상 자신의 인스턴스 자체를 가리킴.자바스크립트
에서는 누가 호출하냐에 따라서 this가 달라질 수 있다.// 동적 바인딩
function Cat(name) {
this.name = name;
this.printName = function () {
console.log(`고양이 이름 출력 : ${this.name}`);
};
}
function Dog(name) {
this.name = name;
this.printName = function () {
console.log(`강아지 이름 출력 : ${this.name}`);
};
}
const cat = new Cat("고영희");
const dog = new Dog("강하지");
cat.printName();
dog.printName();
dog.printName = cat.printName;
dog.printName();
cat.printName();
function printOnMonitor(printName) {
console.log("모니터를 준비하고, 전달된 콜백을 실행");
printName();
}
printOnMonitor(cat.printName); // undefined 출력. JAVA와 달리 JS에서는 동적으로 바인딩되어 값이 고정적이지 않아서 그렇다.
특징
1. 문법이 깔끔하다
2. 생성자 함수로 사용이 불가능. (== 무거운 프로토타입을 만들지 않음)
3. 함수 자체가 arguments
4. this에 대한 바인딩이 정적으로 결정된다.
(함수에서 제일 근접한 상위 스코프의 this에 정적으로 바인딩된다.)
// 자바스크립트의 함수는 만능이다.
// 함수처럼 사용, 생성자 함수로 사용 (Class)
// 하지만, 이걸 위해서 불필요한 무거운 프로토타입(많은 데이터를 담고 있는) 객체가 생성됨
const dog = {
name: "dog",
play: function () {
// 안 좋음. key다음 value 식으로 작성.
// 생성자 함수처럼 되어버림 무거워진다.
console.log("와롱왈");
},
// 개선하기 위해선 화살표함수로 개선 가능.
};
dog.play();
const obj = new dog.play();
console.log(" obj : ", obj);
//ES6
const cat = {
name: "cat",
// 위와 달리 바로 함수를 선언하는 것 처럼 가능
// 객체의 메서드 (오브젝트에 속한 함수)
play() {
console.log("냐옹");
},
};
cat.play();
// const obj1 = new cat.play(); // 생성자 함수로 사용할 수 없음.
크게 두 번의 과정을 거칩니다.
1. 원시 코드에서 DOM 및 CSSOM 구성
2. Render Tree를 사용하여 최종 웹 페이지 생성
참고 블로그 링크
참고 블로그 링크_그런 REST API로 괜찮은가?
REST의 원리를 따르는 API 시스템을 의미. REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있다.
1-1. REST란?
HTTP URI(Uniform Resource Identifier)
를 통해 자원을 명시HTTP Method(Post, Get, Put, Delete, Patch 등)
를 통해 해당 자원(URI)
에 대한 CRUD Corperation
을 적용하는 것.1-2. REST API가 아닌 경우는?
“Client-server / stateless / cacheable / ⭐️ uniform interface ⭐️/ layered system / code-on-demand”
가 지켜지지 않으면 RESTful API가 아니다.