유효범위(Scope)는 변수의 수명을 의미한다. JS에서 함수 내
에 선언한 변수는 지역변수가 되고, 함수 밖
에서 선언한 변수는 전역변수가 된다.
- var 를 빼고 선언하면, 함수 내에서 선언하더라도 전역 변수로 선언된다.
1 | function fscope(){ |
함수 내에서 var
를 생략했을 때는, 먼저 지역변수를 체크하고 없다면 전역변수로 변수를 할당한다.
- 함수 스코프만 존재한다! :
{}
스코프는 없음.
1 | for (var i = 0; i < 1; i++) { |
java와 같은 {}
함수 스코프를 쓰는 언어에서는 에러가 날 것이다.
- 정적 유효범위(statical scoping), 혹은 렉시컬(lexical scoping)
사용할때, 해당 함수 스코프에서 지역변수가 없으면 전역변수를 사용.
1 | var i = 5; |
전역변수를 불가피하게 사용할 때
익명함수를 활용하여, 전역 변수를 지역변수화.
익명함수 선언 및 호출 후
()
괄호로 묶어줌.
1 | (function() { |
컨텍스트
실행 컨텍스트
는 다른 데이터가 접근 가능한지, 어떻게 행동할지(?) 규정되는 곳인다. 보통 this
로 자신의 컨텍스트 값들을 접근할 수 있다.
- 가장 바깥 컨텍스트는 전역 컨텍스트(Window)이다.
- 함수 정의
- JS 인터프리터 : (전역변수 객체 + 해당 함수 객체)를 함수 내부 [[Scope]] 프로퍼티에 저장한다.
- 함수 호출
- 실행 컨텍스트 생성
- [[Scope]] 프로퍼티 복사
- 스코프 체인 생성
- arguments를 포함한 활성화 객체 만들어짐.
- 스코프 체인 첫째에 활성화 객체가 위치하고, 둘째에 전역 밴수 객체가 위치.
- 함수 실행 끝
- 활성화 객체 파괴
스코프 체인? 실행중인 컨텍스트가 접근할 수 있는 모든 변수와 함수에 순서가 정의되어 있다.
1 | var color = "blue"; |
위 changeColor()가 실행되면, 스코프 체인이 만들어지고, 체인의 앞쪽에는 함수자체의 변수객체
와 전역 컨텍스트의 변수 객체
가 들어 있다. color 변수는 함수자체의 스코프 체인
에서 찾을 수 있으므로 접근이 가능하다. 없으면 스코프 체인을 따라 한단계 올라가, 전역 컨텍스트의 변수객체에 접근한다.
Reference
프론트엔드 개발자를 위한 자바스크립트 프로그래밍, 니콜라스 자카스