⚡스코프에 대해 설명해주세요
스코프는 식별자가 유효한 범위를 말합니다. 또는
스코프는 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있습니다.
모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는
유효 범위가 결정되기 때문입니다.
⚡식별자 결정에 대해 말해주세요
식별자 결정이란 이름이 같은 두개의 변수 중 어떤 변수를 참조할 것인지를 결정하는 것을 말합니다.
자바스크립트 엔진은 스코프를 통해 어떤 변수를 참조할 지를 결정합니다.
⚡스코프가 없으면 어떤 일이 생기나요?
스코프 개념이 없으면 같은 이름을 갖는 변수는 충돌을 일으키므로
프로그램 전체에서 중복되는 이름의 변수를 사용할 수 없게됩니다.
⚡스코프체인에 대해서 설명해주세요
함수는 전역에서 정의할수도, 함수 내부에서 정의할 수도 있습니다.
이렇듯 함수 안에 함수를 정의하는 경우 함수 몸체 내부에 정의한 함수를 중첩 함수라 하고
중첩 함수를 포함하는 함수를 외부함수라고 합니다.
함수가 중첩될 수 있다는 것은 함수의 지역 스코프도 중첩될 수 있다는 뜻이며
스코프는 함수의 중첩에 의해 계층적인 구조를 가진다는 것을 말하며
이렇듯 스코프가 계층적으로 연결된 것을 스코프 체인이라고 말합니다.
⚡변수의 참조과정을 스코프체인과 연관하여 설명해주세요
변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해서
변수를 참조하는 코드의 스코프에서부터 시작하여
상위 스코프 방향으로 이동하면서 선언된 변수를 검색합니다.
이를 통해 상위 스코프에서 선언한 변수를 하위 스코프에서도 참조할 수 있습니다.
하지만 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수는 없습니다.
스코프체인은 상위 스코프 방향으로만 이동하며 선언된 변수를 검색하기 때문입니다.
⚡함수 레벨 스코프와 블록 레벨 스코프를 설명해주세요
자바스크립트에서 var 키워드로 선언된 변수는 오로지 함수의 코드 블록만을
지역 스코프로 인정합니다. 이는 다른 프로그래밍언어들과 다른 차이점이라고 할 수 있습니다.
이렇게 함수의 코드 블록만을 지역 스코프로 인정하는 특성을 함수레벨스코프라고 합니다.
반면 모든 코드블록을 지역 스코프로 인정하는 것은 블록 레벨 스코프라고 합니다.
let, const는 블록 레벨 스코프를 지원합니다.
⚡자바스크립트의 렉시컬 스코프가 뭔가요?
렉시컬 스코프(정적 스코프)는 동적 스코프 방식과 달리 상위 스코프가 동적으로 변하지 않고
함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되며 이를 계속 기억하는 것을 말합니다.
즉 자바스크립트에서 함수는 어디서 정의 했는지에 따라 상위 스코프가 결정됩니다.
⚡변수의 생명주기에 대해 말해주세요
만약 변수에 생명주기가 없다면 한번 선언된 변수는 영원히 메모리 공간을 점유할것입니다.
프로그램을 종료하지 않는 한 계속 메모리 공간을 점유하는 문제를 해결하기위해
변수는 자신이 선언된 위치에서 생성되고 소멸합니다.
전역변수의 생명주기는 애플리케이션의 생명 주기와 같고
지역변수의 생명주기는 함수의 생명주기와 같습니다.
즉 함수내의 지역변수는 함수가 호출되면 생성되고 종료하면 소멸합니다.
⚡지역 변수의 생명주기에 대해 좀 더 자세하게... 말해 줄 수있어요?
지역 변수의 생명주기는 대부분 함수의 생명주기와 일치하지만 아닌 경우도 있습니다.
변수는 메모리 공간이 확보된시점부터 메모리 공간이 해제되어 가용 메모리풀에 반환되는 시점까지를
생명주기로 가집니다.
1. 따라서 변수는 자신이 등록된 스코프가 소멸(메모리가 해제)될 때까지 유효합니다.
2. 변수는 아무도 참조하지않으면 가비지 콜렉터에 의해 해제됩니다.
3. 누군가가 메모리 공간을 참조하면 가비지 콜렉터는 메모리를 해제하지 않고 확보한 상태로 있습니다.
따라서 위의 경우엔 함수가 종료되어도 지역 변수는 함수보다 오래 생존할 수도 있습니다.
⚡ 전역 객체가 뭔가요?
전역 객체는 코드가 실행되기 이전에 자바스크립트 엔진에 의해
어떤 객체보다도 먼저 생성되는 특수한 객체를 말합니다.
전역 객체는 브라우저에서는 window // Nodejs환경에서는 global 객체를 의미합니다.
전역 객체를 가리키는 식별자는 globalThis입니다.
전역 객체는 표준 빌트인 객체와 환경에 따른 호스트 객체
var 키워드로 선언한 전역 변수와 전역 함수를 프로퍼티로 가집니다.
⚡전역 변수는 어떤 문제가 있을까요?
전역변수는 암묵적 결합을 허용하고 긴 생명주기를 가지며 스코프체인상에서 종점에 존재하며
네임스페이스를 오염 시킨다는 문제점을 가지고 있습니다.
전역변수는 모든 코드가 참조하고 변경할 수 있으며 이는 의도치않게 상태가 변경될 위험성이 커짐을 뜻합니다.
또한 긴 생명주기를 가져서 메모리 리소스도 오랜 기간 소비합니다.
또한 전역 변수는 스코프 체인의 종점에 있으므로 검색속도가 가장 느립니다.
그리고 파일이 분리되어있다해도 하나의 전역 스코프를 공유하기 때문에
다른 파일 내에서 같은 이름의 전역 변수가 존재할 경우 예상 못한 결과를 낳을 수 있습니다.
⚡전역 변수의 문제를 해결하기 위한 방법은 뭐가 있을까요?
모든 코드를 즉시 실행 함수로 감싸주면
모든 변수는 즉시 실행 함수의 지역 변수가 될 것입니다.
혹은 네임스페이스 객체를 이용할수도 있을 것입니다.
전역에 네임 스페이스 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를
프로퍼티로 추가하는 방법입니다.
혹은 모듈 패턴을 이용할 수 있습니다.
관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만드는 것입니다.
모듈패턴을 이용하면 전역 변수의 억제와 동시에 캡슐화까지 구현할 수 있습니다.
⚡ var 키워드의 문제점을 말해주세요
var 키워드의 문제점은 다음과 같습니다.
1. 변수의 중복 선언 허용
2. 함수 레벨 스코프만 지역 스코프로 인정함
3. 변수 호이스팅으로 인해 변수 선언문 이전에 참조할 수 있음
⚡let 키워드를 사용하면 호이스팅이 발생하지 않나요?
let을 사용해도 호이스팅은 발생하지만 변수 초기화 이전엔 일시적 사각지대 구간으로 취급되어
변수를 참조하지 못하도록 막습니다.
이는 var 키워드는 런타임 이전에 암묵적으로 선언과 초기화가 한번에 진행되지만
let은 선언 단계와 초기화단계가 분리되어 진행되기 때문에 가능합니다.
⚡ var 와 let의 차이가 무엇인가요?
var로 선언한 변수는 전역 객체의 프로퍼티가 되지만 let은 그렇지 않습니다.
즉 window.foo, global.foo와 같이 접근할 수 없습니다.
let 으로 선언한 변수는 선언적 환경 레코드 내에서 존재하게 됩니다.
⚡const로 선언된 변수를 수정할 수 있나요?
const로 선언된 변수는 재할당이 금지되지만
프로퍼티의 동적 생성,삭제,변경 등을 통해 객체를 변경할 수는 있습니다.
하지만 객체가 변경되더라도 변수에 할당된 참조 값은 변경되지 않습니다.
반응형
'javascript' 카테고리의 다른 글
요약 정리는 못 참지 않을까요? (4) (0) | 2023.01.10 |
---|---|
요약 정리는 못 참지 않을까요? (3) (0) | 2023.01.10 |
요약 정리는 못 참지 않을까요? (1) (1) | 2023.01.06 |
자바스크립트 실행 컨텍스트 (execution context) 란? (2) (1) | 2022.12.25 |
자바스크립트 실행컨텍스트 (execution context) 란? (1) | 2022.12.25 |