퀵지식

steyu·2022년 11월 24일
0

for구문 안의 break, continue

break: 가장 근접한 반복문을 벗어난다.
continue: continue뒤에 있는걸 실행하지않고, 당시 반복을 뛰어넘어 다음 반복으로 넘어간다

fetch needs to response.json()

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데이터가 출력 됨
    });

closure

링크텍스트

클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.

var은 블록스코프를 생성하지않는다. 전역변수라 값이 바뀔수 있다

그에 해결방안으로 블록 스코프 변수를 생성할 수 있도록 하는 let과 const가 나왔다

var, let

자신을 선언한 블록과 모든 하위 블록을 스스로의 스코프로 가집니다. 이런 점에서는 let이 var와 유사합니다.
그러나 둘의 중요한 차이는,

  • var의 경우 스코프가 '자신을 선언한 블록'이 아니라, 자신의 선언을 포함하는 함수라는 점입니다.
  • let 은 같은 변수를 같은 함수나 블록 스코프 안에서 다시 선언하려고 시도하면 SyntaxError가 발생합니다, 하지만 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 변수에 더 이상 접근할 수 없게 될 것으로 예상하는 것이 일반적이다.

하지만 위의 예시와 자바스크립트의 경우는 다르다. 그 이유는 자바스크립트는 함수를 리턴하고, 리턴하는 함수가 클로저를 형성하기 때문이다

closure를 이용한 privtate method

자바스크립트는 태생적으로는 이런 방법을 제공하지 않지만 클로저를 이용하여 프라이빗 메소드를 흉내내는 것이 가능하다. 프라이빗 메소드는 코드에 제한적인 접근만을 허용한다는 점 뿐만 아니라 전역 네임 스페이스를 관리하는 강력한 방법을 제공하여 불필요한 메소드가 공용 인터페이스를 혼란스럽게 만들지 않도록 한다.

다른 클로저를 갖으므로 독립성을 유지한다.

클로저 일반적인 실수

클로저가 같은 환경을 공유해서 생기는 문제

해결책

  • 더 많은 클로저를 사용. 새로운 환경을 생성해서 독립적인 환경을 갖게 한다
  • 익명클로저
  • use let: 모든 클로저가 블록 범위 변수를 바인딩할 것이므로 추가적인 클로저를 사용하지 않아도 된다

클로저를 사용안해도 되는때

예를들어 새로운 객체/클래스를 생성 할 때, 메소드는 일반적으로 객체 생성자에 정의되기보다는 객체의 프로토타입에 연결되어야 한다. 그 이유는 생성자가 호출 될 때 마다 메서드가 다시 할당되기 때문이다 (즉, 모든 개체가 생성 될 때마다).

메소드는 프로토타입에 연결되있으면 되지, 새로운 객체를 생성할때마다 메소드를 다시 생성할 필요없다.

var, let hoist

var: 맨위로 끌어올려서 undefined 값을 준다. (undefined)
let: 맨위로 끌러올리지만 값을 주지 않는다. (ReferenceError)

익명함수 쓰는 이유

0개의 댓글

관련 채용 정보