자바스크립트 스코프
2018-02-08
1. 전역 스코프
2. 블록 스코프
3. 클로저
- closure: 닫혀있음, 폐쇄성, 완결성
- 함수 내부에서 생성한 데이터와 그 유효범위(스코프)로 인해 발생하는 특수한 현상/상태
- 내부함수는 외부함수의 지역변수에 접근할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근할 수 있다
- 클로저 예제
- 클로저 예제2
3-1. lexical environment
- 선언 당시의 환경에 대한 정보를 담는 객체(구성 환경)
- 이 함수는 이러이러한 정보들로 구성되어 있다
- 함수와 그 함수가 선언될 당시의 환경정보 사이의 조합
3-2. 클로저 사용 이점
- 접근 권한 제어
- 지역변수 보호
- 데이터 보존 및 활용
3-3. 클로저로 private member 만들기
- 1) 함수에서 지역변수 및 내부함수 등을 생성한다
- 2) 외부에 노출시키고자 하는 멤버들로 구성된 객체를 return 한다
- return한 객체에 포함되지 않은 멤버들은 private 한다
- return한 객체에 포함되어 있는 멤버들은 public하다.
- 클로저로 private member 만들기
4. 즉시함수호출
(function(){
})();
5. 함수 스코프와 호이스팅
5-1. 변수 호이스팅
- let을 쓰면 변수를 선언하기 전에 사용하면 에러가 발생하지만, var는 선언하기 전에도 사용할 수 있다.
- var로 선언한 변수는 끌어올린다는 뜻의 호이스팅을 따른다.
- 자바스크립트는 함수나 전역 스코프를 보고 var로 선언한 변수를 맨 위로 끌어 올림
- 선언만 끌어올려지며 할당은 끌어올려지지 않음.
- 변수 호이스팅 예제
- 변수 호이스팅 예제2
5-2. 함수 호이스팅
- 함수 선언도 스코프 맨 위로 끌어올려진다. 따라서 함수 선언 전에 호출할 수 있다
- 단, 변수에 할당된 함수 표현식은 끌어올려지지 않는다. 변수의 스코프 규칙을 따름
- 함수 호이스팅 예제
6. var, let, const
- var는 함수 스코프이고 let, const는 블록 스코프이다
- let은 변수에 재할당이 가능하지만 const는 변수 재선언, 재할당 모두 불가능 하다.
// let
let a = 'test';
let a = 'test2'; // Uncaught SyntaxError: Identifier 'a' has already been declared
a = 'test3'; // 가능
// const
const b = 'test';
const b = 'test2'; // Uncaught SyntaxError: Identifier 'b' has already been declared
b = 'test3'; // Uncaught TypeError:Assignment to constant variable.
- var, let 예제 반복문 클로저
7. this
- 전역 공간에서 this : window / global
- 함수 내부에서 this : window / global
- 메소드 호출 시 : 메소드 호출 주체(메소드 명 앞)
- callback에서 : 기본적으로 함수 내부에서와 동일
- 생성자함수에서 : 인스턴스
- 콜백 함수와 this
- 콜백 함수와 this 예제2
- 콜백, bind, this 예제2
전체 예제는 ch7.스코프 참고.