<그냥하자> JavaScript (11) 블록문과 스코프

.·2024년 7월 7일
0

참조 : 인프런 얄팍한코딩사전

블록문

0개 이상의 문statement들을 묶은 단위
일반적으로, 이후 배울 제어문, 함수 등에 사용
새로운 스코프 생성

스코프

블록 안에 선언된 변수와 상수를 밖에서 사용 불가


블록 안쪽에서는 바깥의 것 사용 가능

블록 안쪽에 변수나 상수가 새로 선언되면 바깥 것을 덮어씀

스코프 체인

stack - LIFO 후입선출 나중에 온 것이 먼저 나감
블럭 안에 해당 변수/상수가 없으면 바깥족으로 찾아 나감 -> 체이닝

전역 global 변수/상수

데이터 data 영역에 위치
코드 어느 곳에서든 접근 가능 - 블록 내 동명의 변수나 상수에 덮어씌워지지 않는 이상
프로그램 종료시 소멸
⭐️ 전역변수 사용은 최소화할 것

지역 local 변수/상수

스택 영역에 위치
해당 블록 안에서만 접근 가능
블록 실행 종료시 소멸
⭐ 변수나 상수는 가능한 사용할 블록 내에서 선언 - 메모리 절약


+++ 09.02 추가

블록 스코프와 함수 스코프

모든 변수는 스코프(scope, 범위)가 있다. var는 함수 스코프, let은 블록 스코프이다.

함수를 경계로 접근 가능 여부가 달라지는 것을 함수 스코프라고 하고 함수 스코프를 다르게 말하면 함수가 끝날 때 함수 내부의 변수도 같이 사라진다.

블록은 if, for, while 문 함수에서 볼 수 있는 중괄호({})를 의미한다. 블록 스코프를 다르게 말하면 블록이 끝날 때 내부의 변수도 같이 사라진다.

클로저와 정적 스코프

클로저(closure)는 외부 값에 접근하는 함수이다. 모든 자바스크립트 함수는 클로저 가 될 수 있다.

const func = () => { 
    console.log(a);
};

if (true) { 
    const a = 1;
    func();
};

위 코드가 에러가 발생되는 이유는 변수 a는 if 문 안에서 선언되었고, func() 함수는 if문 바깥에서 선언되었다. const는 블록 스코프이므로 if문 바깥에서는 변수 a에 접근할 수 없다. func()함수도 if 문 바깥에 있으므로 변수 a에 접근할 수 없다.

이처럼 함수가 선언된 위치에 따라 접근할 수 있는 값이 달라지는 현상을 '함수는 정적 스코프(lexical scope)를 따른다 라고 표현한다. 선언된 위치가 아니라 호출된 위치에 따라 접근할 수 있는 값이 달라진다면 동적 스코프를 따르게 되는데 자바스크립트는 정적 스코프를 따른다.

profile
해야 되는 일이 하고 싶은 일로

0개의 댓글