별도의 컴파일 작업을 수행하지 않는 인터프리터 언어
변수 호이스팅
- 변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점이 아닌 그 이전 단계에서 먼저 실행된다.
- js 엔진은 소스코드 실행 전 소스코드의 평가 과정 거치고 , 실행 준비를 한다.
- 실행준비 단계에서 모든 선언문을 소스코드에서 찾아 먼저 실행한다
- 변수 선언문이 코드의 선두로 끌어 올려진 것 처럼 동작하는 것을 호이스팅이라고 한다.
Scope (스코프)
- 모든 식별자 (변수 , 함수 , 클래스 등등) 자신이 선언된 위치에 의해 다른 코드가 자신을 참조할 수 있는 유효 범위가 결정 되는 것
- 식별자가 유효한 범위를 말한다.
- 전역 스코프(코드의 가장 바깥 영역) 와 지역 스코프(함수 내부)
- 전역 변수는 어디서든 참조 가능 , 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효
- 함수는 중첩될 수 있음, 당연히 스코프도 함수의 중첩에 의해 계층을 갖는다 ⇒ 스코프 체인
- 변수를 참조할때 js는 스코프 체인으로 통해 변수를 참조하는 코드 스코프 부터 상위로 이동하면서 검색
var, let , const
- var
- 같은 스코프 내에서 중복 선언 허용
- 초기화문이 있는 변수 선언문은 var 키워드가 없는 것처럼 동작
- 함수의 코드 블록만을 지역 스코프로 인정, 함수 외부에서 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 됨 (for 문, if문 등을 인정안함)
- let (ES6)
- 같은 변수를 중복 선언하면 에러 발생
- 모든 코드 블록을 지역 스코프로 인정
- 선언단계와 초기화 단계를 분리되어 진행
- 런타임 이전에 암묵적으로 선언 단계가 실행되지만 초기화 단계는 변수 선언문에 도달했을 때 실행
- const (ES6)
- 상수를 선언하기 위해 사용
- 반드시 선언과 동시에 초기화해야 한다.
- 재할당이 금지됨
- const 키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다.
- 재할당을 금지할 뿐 불변을 의미하지 않는다.
Execution Context 실행 컨텍스트
- js 엔진은 소스코드를 2개의 과정 , 평과와 실행으로 나누어 처리한다.
- 평가 과정에서 실행 컨텍스트 (코드 실행에 필요한 정보) 생성하고 선언문을 먼저 실행
- 소스코드가 순차적으로 실행될때 필요한 정보를 실행 컨텍스트가 관리하는 스코프에서 검색해서 취득한다.
- 실행되면서 값의 변경 등 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록된다.
- 실행 컨텍스트는 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
- 렉시컬 환경
- 식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조
- 스코프와 식별자를 관리하는 것
- 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할
- 렉시컬 스코프
- js엔진은 함수를 어디에 정의했는지에 따라 상위 스코프를 결정, 이를 렉시컬 스코프(정적 스코프)라고 한다.
클로저
- 중첩 함수에서 외부함수 , 상위 스코프의 식별자를 참조 할 수 있는것
- 외부 함수의 변수를 참조할 수있는 중첩 함수를 클로저
- 함수와 그 함수가 선언된 렉시컬 환경과의 조합
일급 객체
- 변수나 자료구조에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
- js의 함수는 모두 만족하므로 일급 객체 이다.