break: 가장 근접한 반복문을 벗어난다.
continue: continue뒤에 있는걸 실행하지않고, 당시 반복을 뛰어넘어 다음 반복으로 넘어간다
js 개발자들은 network request 요청이 필요할 경우 대부분 axios.js나 기타 다른 라이브러리를 쓰는 것 같다. js에서 기본적으로 제공하는 fetch라는 함수가 있지만, fetch를 사용할 경우 응답받은 body데이터의 form을 직접 변환해야 하는데, 이 단계를 자동으로 해주기 때문이고, 에러 핸들링도 편하기 때문이다.
fetch로는 데이터를 바로 사용할 수 없다.
fetch를 사용할 땐 두 단계를 거쳐야 한다. 먼저 올바른 url로 요청을 보내야 하고, 바로 뒤에오는 응답에 대해 json()을 해줘야 하는 것이다(axios는 json()과정을 자동으로 해주는 셈이다).
json()은 Response 스트림을 가져와 스트림이 완료될때까지 읽는다. 그리고 다 읽은 body의 텍스트를 Promise형태로 반환한다.
fetch(`https://api.openweathermap.org/data/2.5/weather?
lat=${lat}&lon=${lon}&appid=${API_KEY}&units=metric`)
.then((res) => {
return res.json(); //Promise 반환
})
.then((json) => {
console.log(json); // 서버에서 주는 json데이터가 출력 됨
});
클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.
var은 블록스코프를 생성하지않는다. 전역변수라 값이 바뀔수 있다
그에 해결방안으로 블록 스코프 변수를 생성할 수 있도록 하는 let과 const가 나왔다
자신을 선언한 블록과 모든 하위 블록을 스스로의 스코프로 가집니다. 이런 점에서는 let이 var와 유사합니다.
그러나 둘의 중요한 차이는,
function varTest() {
var i = 1;
if (true) {
var i = 2;
console.log(i); // 2
}
console.log(i); // 2
}
function letTest() {
let i = 1;
if (true) {
let i = 2;
console.log(i); // 2
}
console.log(i); // 1
}
varTest();
letTest();
함수 안의 지역 변수들은 그 함수가 처리되는 동안에만 존재한다. makeFunc() 실행이 끝나면(displayName함수가 리턴되고 나면) name 변수에 더 이상 접근할 수 없게 될 것으로 예상하는 것이 일반적이다.
하지만 위의 예시와 자바스크립트의 경우는 다르다. 그 이유는 자바스크립트는 함수를 리턴하고, 리턴하는 함수가 클로저를 형성하기 때문이다
자바스크립트는 태생적으로는 이런 방법을 제공하지 않지만 클로저를 이용하여 프라이빗 메소드를 흉내
내는 것이 가능하다. 프라이빗 메소드는 코드에 제한적인 접근
만을 허용한다는 점 뿐만 아니라 전역 네임 스페이스를 관리하는 강력한 방법을 제공하여 불필요한 메소드가 공용 인터페이스를 혼란스럽게 만들지 않도록 한다.
다른 클로저를 갖으므로 독립성을 유지한다.
클로저가 같은 환경을 공유해서 생기는 문제
예를들어 새로운 객체/클래스를 생성 할 때, 메소드는 일반적으로 객체 생성자에 정의되기보다는 객체의 프로토타입에 연결되어야 한다
. 그 이유는 생성자가 호출 될 때 마다 메서드가 다시 할당되기 때문이다 (즉, 모든 개체가 생성 될 때마다).
메소드는 프로토타입에 연결되있으면 되지, 새로운 객체를 생성할때마다 메소드를 다시 생성할 필요없다.
var: 맨위로 끌어올려서 undefined 값을 준다. (undefined)
let: 맨위로 끌러올리지만 값을 주지 않는다. (ReferenceError)