본문 바로가기
javascript

scope & variable

by csue 2021. 5. 2.

scope

변수에 대해 정리하기 전에 먼저 scope 에 대해 간단하게 정리해보자.

scope 란 변수에 접근할 수 있는 범위를 의미한다. 전역 스코프global 와 지역 스코프local 의 두 가지 타입으로 나뉜다. 전역 스코프는 말 그대로 코드 전역에 선언되어 어디에서든지 해당 변수에 접근할 수 있는 권한이 부여된다. 지역 스코프는 해당 블록에서만 변수에 접근할 수 있다.

 

const x = 17;

function scopeTest() {
    var x = 11;
    console.log(x);
}

scopeTest() // 11
console.log(x); // 17

variable

변수를 선언하는데에는 var, let, const 세 가지의 방법이 있다.

var

var 를 이용한 변수 선언은 함수가 시작할 때 처리된다. 함수 본문 내에서 var 를 이용하여 선언한 변수는 선언 위치와 상관없이 함수 본문이 시작되는 최상위 지점으로 끌어올려진다. 블록 기준으로 스코프가 생기지 않기 때문에 한번 선언되면 전역적으로 영향을 미칠 수 있어 선언되기 이전의 변수에도 영향을 끼칠 수 있었다. 이를 호이스팅 hoisting 이라고 한다. 이러한 특징 덕분에, var 로 선언한 변수는 선언 전에 사용하여도 error 가 발생하지 않는다.

hoisting 은 선언에서만 이루어지고 할당=에는 일어나지 않는다. 아래의 예제 코드를 보면 이해할 수 있다.

 

function sayHi() {
    var phrase; // 선언은 함수 시작 시 처리된다.
    console.log(phrase); // undefined 출력
    // var phrase; << 여기에 선언해도 hoisting 되기 때문에 상관 없음.
    phrase = "Hello"; // 할당은 실행 흐름이 해당 코드에 도달했을 때 처리된다.
  }

sayHi(); // Hello 가 아닌 undefined 가 출력된다.

 

이러한 단점을 보완하기 위해, es2015(ES6) 이후 let 과 const 가 추가되었다.

let

let 은 var 와 거의 유사하게 동작한다. 다만 let 은 hoisting 의 적용을 받되 실행되는 블록에서만 유효한 범위를 갖는 지역 변수를 선언한다. 선언과 동시에 임의의 값으로 초기화할 수도 있다.

 

function varTest() {
    var x = 1;
    if (true) {
      var x = 2;  // var = 블록 기준으로 스코프가 생기지 않으므로 상위 블록과 같은 변수 = 1에서 2로 변수가 바뀐다.
      console.log(x);  // 2
    }
    console.log(x);  // 2 
  };

function letTest() {
    let x = 1;
    if (true) {
      let x = 2;  // let = 블록에서만 유효하므로 상위 블록과 다른 변수 = 두 x 는 다른 변수이다 = 별개로 동작한다.
      console.log(x);  // 2
    }
    console.log(x);  // 1
  };

 

변수 재할당이 가능하고, 선언과 초기화가 분리되어 이루어지므로 이전의 변수에 영향을 끼치지는 않지만 같은 변수를 같은 함수나 블록 범위 내에서 재선언하면 syntax error 가 발생한다. 따라서 변수는 딱 한 번만 선언하고, 선언한 변수를 참조할 때는 let 없이 변수명만 사용하여 참조해야 한다.

 

function varTest() {
    var x = 1;
    var x = 2;
    console.log(x); // 2
}

function letTest() {
    let x = 1;
    let x = 2;
    console.log(x); // SyntaxError: Identifier 'x' has already been declared
}

const

변하지 않는 변수인 상수를 선언할 때에는 let 대신 const 를 사용한다.
const 역시 let 과 마찬가지로 블록 범위 내에서만 유효한 범위를 갖는다. 상수의 값은 재선언 및 재할당이 불가능하다. 즉 immutable 하다는 뜻이다.

결론

var 의 특성 때문에 되도록이면 const, let 을 이용하여 선언을 하는 편이 근래의 트랜드라고 한다.

'javascript' 카테고리의 다른 글

V8 Engine memory management  (0) 2021.07.23
data type  (0) 2021.05.01
javascript  (0) 2021.04.27