변수
: 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.
개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없고, 변수를 통해 안전하게 값을 접근할 수 있다.
변수이름
: 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름
변수 이름을 사용해 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다.
변수 값
: 변수에 저장된 값
할당
: 변수에 값을 저장하는 것
참조
: 변수에 저장된 값을 읽어 들이는 것
식별자
: 어떤 값을 구별해서 식별할 수 있는 고유한 이름
값이 아닌 메모리 주소를 기억하고 있다.
변수 선언
: 변수를 생성하는 것
- 값을 저장하기 위한 메모리 공간을 확보한다.
- 변수 이름과 확보된 메모리 공간의 주소를 연결
- 값을 저장할 수 있게 준비하는 것
- 선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
- 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.
undefined
: 자바스크립트에서 제공하는 원시 타입의 값
모든 식별자는 실행컨텍스트에 등록된다.
실행 컨텍스트
: 자바스크립트엔진이 소스코드를 평가, 실행하기 위해 필요한 환경을 제공하고, 코드의 실행 결과를 관리하는 영역
초기화
: 변수가 선언된 이후 최초로 값을 할당하는 것
ReferenceError(참조에러)
: 식별자를 통해 값을 참조하려 했지만, 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을 때 발생하는 에러
console.log(a); // undefined
var a; // 변수 선언문
런타임이 아니라 이전 단계에서 먼저 실행되기 때문이다.
자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행한다.
변수 호이스팅
: 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유의 특징
var a; // 변수 선언
a = 80; // 값의 할당
var b = 90; //변수 선언 & 값의 할당
자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현해도 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행된다.
값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
console.log(a); // undefined
var a; // 변수 선언
a = 80; // 값의 할당
console.log(a) // 80
재할당
: 이미 값이 할당되어 있는 변수에 새로운 값을 다시 할당을 하는 것
상수
: 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없는 것
let a = 10;
a = 20; // 20
const b = 10;
b = 20; // TypeError: Assignment to constant variable.
let a = 80;
a = 90;
위의 코드에 따른 메모리 확보하는 그림이다.
위의 그림을 보면 최종적으로 undified 와 80 은 어떠한 식별자와도 연결되어 있지 않다.
이러한 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제 된다.
단, 메모리에서 언제 해제될지는 예측할 수 없다.
가비지 콜렉션
: 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능.
언매니지드 언어
매니지드 언어
식별자
: 어떤 값을 구별해서 식별해낼 수 있는 고유한 이름
예약어
: 프로그래밍 언어에서 사용되고 있거나, 사용될 예정인 단어. ex) function, var, let ...
네이밍 컨벤션
: 하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위한 규정한 명명 규칙
// 카멜 케이스(camelCase)
let firstName;
// 스네이크 케이스(snake_case)
let firstName;
// 파스칼 케이스(PascalCase)
let FirstName;
// 헝가리언 케이스(typeHungarianCase)
let strFirstName; // type + identifier
let $elem = document.getElementByIm('myId'); // DOM 노드
let observable$ = fromEvent(document, 'click') // RxJS 옵져버블
일반적인 네이밍 컨벤션
변수, 함수 = 카멜 케이스
생성자 함수, 클래스 = 파스칼 케이스