[S1-Unit09] JavaScript - 스코프(Scope)
포스트
취소

[S1-Unit09] JavaScript - 스코프(Scope)

스코프의 정의

스코프(Scope) 는 변수 접근 규칙에 따른 유효 범위를 뜻한다.

스코프의 규칙

  • 안쪽 스코프에서 바깥쪽 스코프로는 접근할 수 있지만, 반대로는 불가능하다.
  • 스코프는 중첩이 가능하다.
  • 가장 바깥의 스코프는 전역 스코프 (Global scope) 라고 부른다.
    • 전역의 반대말은 지역(local)으로 전역이 아닌 다른 스코프는 전부 지역 스코프(Local scope) 이다.
  • 지역 변수는 전역 변수보다 더 높은 순위를 가진다.
    1
    2
    3
    4
    5
    
    let name = '김코딩';  // 전역 변수
    
    function showName() {
        let name = '박해커';  // 지역 변수
    }
    


스코프의 종류

블록 스코프 (block scope)

블록 스코프 는 중괄호 기준으로 범위가 구분된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 예제 1
if (true) {
	console.log('I am in the block');
}

// 예제 2
for (let i = 0; i < 10; i++) {
  	// 변수 i는 중괄호 안에서만 사용할 수 있다.
	console.log(i);
}

// 예제 3
{
	console.log('It works');
}

함수 스코프 (function scope)

function 키워드가 등장하는 함수 선언식 및 함수 표현식은 함수 스코프 를 만든다.

1
2
3
4
5
6
7
function getName (user) {
	return user.name;
}

let getAge = function (user) {
	return user.age;
}

화살표 함수 유의할 점

1
2
3
let getAge = user => {
	return user.age;
}

같은 함수여도, 화살표 함수를 사용하면 블록 스코프 로 취급된다.

1
2
3
let getAge = function (user) {
	return user.age;
}

function 키워드를 사용하면 함수 스코프 이며, 이 부분은 화살표 함수와 일반 함수의 가장 큰 차이점이다.


var, let, const 키워드

var 키워드 vs. let 키워드

  • var 키워드는 블록 스코프를 무시하고, 함수 스코프만 따른다. (이전 방식)
    • 모든 블록 스코프를 무시하는 건 아니며, 화살표 함수의 블록 스코프는 무시하지 않는다.
  • 블록 단위로 스코프를 구분했을 때, 훨씬 더 예측 가능한 코드를 작성할 수 있으므로 let 키워드 사용이 권장된다.
  • var를 사용하지 않는다 해도, 함수 스코프는 let 으로 선언된 변수의 접근 범위를 제한한다.
  • var 키워드는 재선언을 해도 아무런 에러가 나지 않지만, let 키워드는 재선언을 방지한다.

const 키워드

  • let 키워드와 동일하게, 블록 스코프를 따른다.
  • 값의 변경을 최소화하여 보다 안전한 프로그램을 만들 수 있다. 값을 새롭게 할당할 일이 없다면, const 사용이 권장된다.
  • 값을 재할당하는 경우, TypeError 를 낸다.

키워드 비교

 letvarconst
 유효 범위 블록 스코프 및 함수 스코프블록 스코프 및 함수 스코프함수 스코프
값 재할당가능불가능가능
재선언불가능불가능가능


변수 선언에서 주의할 점

window 객체

var로 선언된 전역 변수 및 전역 함수는 window 객체에 속하게 된다.

  • 브라우저에는 window 라는 객체가 존재한다.
    • 브라우저 창을 대표하는 객체
    • 그러나, 브라우저 창과 관계없이 전역 항목도 담고 있음
  • var로 선언된 전역 변수와 전역 함수가 window 객체에 속함
    1
    2
    3
    4
    5
    6
    7
    8
    
    var myName = '김코딩';
    console.log(window.myName);  // 김코딩
    
    function foo() {
      console.log('bar');
    }
    
    console.log(foo === window.foo);  // true
    

1. 전역 변수는 최소화해야 한다.

전역 변수 는 어디서든 접근 가능한 변수다.

  • 편리한 대신, 다른 함수 혹은 로직에 의해 의도되지 않은 변경이 발생할 수 있다. => 부수 효과 (side effect) 발생

2. let, const를 주로 사용해야 한다.

  • var는 블록 스코프를 무시하며, 재선언을 해도 에러가 나지 않는다고 앞에서 말한 것처럼 동일한 이름의 변수를 재선언 하는 것은 버그를 유발한다.
  • 전역 변수를 var로 선언하는 경우, window 기능을 덮어씌워서 내장 기능을 사용할 수 없게 만들 수 있다.

3. 선언 없는 변수 할당을 금지한다.

선언 키워드(ver, let, const) 없이 변수를 할당하면 안된다. 선언 없이 변수를 할당하면, 해당 변수는 var 로 선언한 전역 변수처럼 취급된다.

1
2
3
4
5
6
7
function showAge() {
    age = 90;
    console.log(age);  // 90
}
showAge();
console.log(age);  // 90
console.log(window.age);  // 90

실수를 방지하기 위해 Strict Mode 를 사용할 수 있다. Strict Mode 는 브라우저가 보다 엄격하게 작동하도록 만들어 준다. “선언 없는 변수 할당”의 경우도 Strict Mode는 에러로 판단한다.

Strict Mode를 적용하려면, js 파일 상단에 'use strict' 라고 입력하면 된다.

1
2
3
4
5
6
7
'use strict';

function showAge() {
    age = 90;  // 여기서 error 발생
    console.log(age);  // 90
}
showAge();


Reference

CODESTATES (SEB_FE_43)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.