뜬금없지만 클로저에 대한 지식이 부족하다고 생각이 들어 클로저의 개념을 다시 찾아보고 공부하면서 블로그에 정리하려 했는데, 그 전에 스코프의 개념부터 정리해두면 좋을 것 같아서 정리해보려 한다.
스코프(Scope)는 자바스크립트를 포함한 모든 프로그래밍 언어의 기본적인 개념이므로 잘 이해하고 있어야 한다.
var x = 'global'; function foo () { var x = 'function scope'; console.log(x); } foo(); // ? console.log(x); // ?
위 예제를 보면 이름이 같은 변수 x가 중복 선언되었다.
전역에서 변수 x를 참조할 때, 그리고 함수 foo 내부에서 변수 x를 참조할 때
이름이 중복된 2개의 변수 중 어떤 변수를 참조해야 할까?
스코프
는 참조 대상 식별자(identifier, 변수, 함수의 이름과 같이 어떤 대상을 다른 대상과 구분하여 식별할 수 있는 유일한 이름)를 찾아내기 위한 규칙이다.
자바스크립트는 이 규칙대로 식별자를 찾는다.
식별자는 자신이 어디에서 선언됐는지에 의해 자신이 유효한(다른 코드가 자신을 참조할 수 있는) 범위를 갖는다.
위 예제에서 선언된 전역 변수 x는 어디에든 참조할 수 있다.
하지만 foo 내에서 선언된 x는 foo 내부에서만 참조할 수 있고 외부에서는 참조할 수 없다. 이러한 규칙이 스코프(Scope)이다.
만약 스코프가 없다면? 같은 식별자 이름은 충돌되어 전체 프로그램에서 하나밖에 쓰지 못 할 것이다.
자바스크립트에서 스코프를 구분해보면 다음과 같이 2가지로 나눌 수 있다.
전역 스코프 (Global scope)
- 코드 어디에서든지 참조할 수 있다.
지역 스코프 (Local scope or Function-level scope)
- 함수 코드 블록이 만든 스코프로 함수 자신과 하위 함수에서만 참조할 수 있다.
모든 변수는 스코프를 갖는다.
변수의 관점에서 스코프를 구분하면 다음과 같이 2가지로 나눌 수 있다.
전역 변수 (Global variable)
- 전역에서 선언된 변수이며 어디에든 참조할 수 있다.
지역 변수 (Local variable)
- 지역(함수) 내에서 선언된 변수이며 그 지역과 그 지역의 하부 지역에서만 참조할 수 있다.
변수는 선언 위치(전역 또는 지역)에 의해 스코프를 가지게 된다.
즉, 전역에서 선언된 변수는 전역 스코프를 갖는 전역 변수이고,
지역(자바스크립트의 경우 함수 내부)에서 선언된 변수는 지역 스코프를 갖는 지역 변수가 된다.
전역 스코프를 갖는 전역 변수는 전역(코드 어디서든지)에서 참조할 수 있다.
지역(함수 내부)에서 선언된 지역 변수는 그 지역과 그 지역의 하부 지역에서만 참조할 수 있다.
간단하게 스코프의 개념을 정리해 보았다.
다음은 클로저의 개념에 대해 다뤄보도록 하겠다!