brunch

You can make anything
by writing

C.S.Lewis

by 홍기린 Aug 08. 2024

스코프(Scope)에 대해서

전역, 블록 스코프 & 동적, 정적 스코프

스코프란, 쉽게 이야기해서 "범위"를 뜻한다. 

범위가 왜 중요하냐면, 내가 선언한 변수가 어디서부터 어디까지 적용되냐를 결정하기 때문이다. 코딩을 하면서 내가 생각했을 땐 a를 참조할 거라고 생각하면서 짰는데, 막상 결과물은 b가 나올 때 스코프나 변수선언 관련한 에러일 수도 있다. 



전역 스코프(Global Scope)

전체에서 접근 가능한 범위를 말한다. 


let name = '어디서든 접근 가능합니다'

function helloWorld() {
    console.log(name) // 결과: "어디서든 접근 가능합니다"
}

helloWorld();



블록 스코프(Block Scope)

중괄호 { } 내에서만 접근 가능한 범위를 말한다.


let name = "어디서든 접근 가능합니다"

function helloWorld() {
    const  nickname = "여기 안에서만 접근 가능해요"

    console.log(nickname) // 결과: "여기 안에서만 접근 가능해요"
    console.log(name) // 결과: "어디서든 접근 가능합니다"
}

console.log(nickname) // error: 선언되지 않은 변수
console.log(name) // 결과: "어디서든 접근 가능합니다"



정적 스코프(Static Scope) & 

동적 스코프(Dynamic Scope)


'범위가 어떻게 결정되느냐'의 방식에 2가지 방식이 있다.

1. 변수가(or 함수가) "사용"된 시점에서 범위가 결정될 것이냐

2. 변수가 "선언"된 위치에 따라 범위가 결정될 것이냐.


1번이 동적 스코프이고, 2번이 정적 스코프이다. Javascript같은 언어는 정적 스코프이다. 일부 오래된 언어를 제외하고는 요즘 언어들은 거의 모두 정적 스코프로 작동한다.


예시 코드를 보자.


let name = "전역"

function firstHello() {
    console.log(name)
}

function secondHello() {
    let name = "함수변수"
    firstHello();
}

secondHello();

secondHello가 실행되면, "함수변수"가 찍힐까, "전역"이 찍힐까? 

정답은 "전역"이다. secondHello함수 내의 firstHello의 함수가 사용되는 시점에서 동적 스코프가 적용된다면 "함수변수"를 바라보겠지만, 정적 스코프에서는 firstHello함수의 코드가 선언(작성)된 위치에서 name을 참조하게 된다.


정적 스코프는 렉시컬 스코프와 같은 걸 가리킨다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari