2021-06-30
학생때를 돌이켜보면, 시험기간에 항상 각 과목의 시험범위를 보며 한숨을 쉬곤했다. '뭐가 이리 많아-!!'라고 생각하면서 매번 시험기간에 툴툴거렸던 기억이 남아있다. 무언가를 공부하고 테스트를 할 때, 흔히 생각하는 범위. 그렇다면 자바스크립트에도 범위라는 개념이 있을까? Scope에 대해서 알아보자.
보아하니, 자바스크립트에서는 Scope를 범위라고 하는 것 같다. Scope를 직역해보니, 영역,범위 라는 뜻이 나온다. 그렇다면, 무슨 범위를 말하는 것일까?
우리가 변수와 메소드 같은 것들을 사용할 수 있는 것은 이름이 있기 때문이다. 프로그램이 커지면 여러 가지 이유로 이름이 충돌하게 된다. 이를 해결하기 위해서 고안된 것이 유효범위라는 개념이다. 사실 Scope는 프로그램을 만드는 데 사용하는 코드의 양이 기하급수적으로 증가하면서 직면하게 되는 막장을 극복하기 위해 만들어졌다.
유효범위인 scope는 변수에 접근할 수 있는 범위를 뜻한다. global과 function-level scope 두가지로 나누어볼 수 있는데 global은 코드 어디에서든지 참조할 수 있고, local은 함수 코드블록이 만든 scope로 함수자신과 하위함수에서만 참조가 가능하다. 자바스크립트에서 함수를 선언하면 함수를 선언할 때마다 새로운 스코프를 생성하게 된다.
c언어는 block level scope를 가지지만 자바스크립트는 funcion level scope를 따르기 때문에 함수코드블록내에 선언된 변수는 함수코드블록내에서만 유효하고, 함수외부에서는 유효하지 않다.
block scope : 블록 레벨 스코프란 코드 블록({…})내에서 유효한 스코프를 의미한다.
function scope : 함수 레벨 스코프란 함수 코드 블록 내에서만 유효한 스코프를 의미한다. 선언된 변수는 함수 코드 블록 내에서만 유효하고 함수 외부에서는 유효하지 않다(참조할 수 없다)는 것이다.
var는 function scope를 가지기 때문에 함수내에서만 지역변수가 유지되었지만, ES6이후에 let/const 키워드가 추가되면서 block scope에도 지역변수를 선언할 수 있게 되었다.
lexical scope : 함수를 어디서 선언하였는지에 따라 상위 스코프를 결정하는 것이다. 호출이 아닌 선언이라는 점에 주의해야한다.
dynamic scope : 함수의 호출에 따라 상위 스코프가 정해지는 것을 Dynamic Scope라고도 한다.
function scope을 가진다. for문을 두개를 사용했을때 for문같은 경우에 {}에 의해서 block scope이 생기게 되는데 첫번째 for문에서 발생한 변화가 두번째 for문에 영향을 줄 수 있다.