개발 공부를 하다가 여러 회사에 면접을 보는 중이다. 그 과정속에서 받았던 질문들을 정리하려 한다.
클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경과의 조합. (함수=반환된 내부함수)
스코프는 함수를 호출할 때가 아니라 함수를 어디에 선언하였는지에 따라 결정된다. 이를 렉시컬 스코핑(Lexical scoping)라 합니다.
따라서 내부에 선언된 내부함수의 경우 자신이 속한 렉스컬 스코프에 있는 변수 등을 참조할 있습니다. (내부 함수가 외부함수의 변수에 접근 가능하다는 뜻)
자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근 할 수 있는데 이러한 함수를 클로저라고 부른다.
클로저는 자신이 생성될 때의 환경을 기억해야 하므로 메모리 차원에서 손해 볼 수 있다.
하지만 js는 강력한 기능으로 자주 사용하는데 클로저가 가장 유용하게 사용되는 상황을 현재 상태를 기억하고 변경된 최신 상태를 유지하는 것이다.
자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근 할 수 있는데 이러한 함수를 클로저라고 부른다.
count 버튼 클릭 시 횟수 올라가는 구조
이벤트 루프는 브라우저 메인 스레드 동작 타이밍을 관리하는 관리자
여기서 메인 스레드란 js 코드 실행이나 브라우저 렌더링을 맡는 등 브라우저의 주된 동작이 수행되는 곳
브라우저 렌더링 과정에서 js 코드릴 처리할 때 콜 스텍에 올라 동작을 수행하게 되고 Promise나 setTimeout과 같은 비동기 관련 콜벡들이 queue에 등록된다.
task queue에 있는 콜벡을 하나씩 실행, setTimeout과 사용자 이벤트 콜벡 처리
let cat = {
sound: "meow",
soundPlay: function () {
setTimeout(() => {
console.log(this.sound);
}, 1000);
}
}
cat.soundPlay();
// 1초 후에 ... "meow"