변수: 하나의 값을 저장하기 위해 확보한 메모리 공간자체 혹은 식별하기 위해 붙인 이름
변수는 하나의 값을 저장하기 위한 수단이다
// 변수명 변수값
var userId = 1;
// 초기화
console.log(result);
var result;
//할당
result = 10 + 30;
console.log(result);
변수 선언이란 변수를 생성하는 것 즉 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장 할 수 있게 준비는 것이다.
변수를 선언할 떄는 var
let
const
키워드를 사용한다.
var의 단점 : 블록 레벨 스코프를 지원하지 않고 함수 레벨 스코를 지원하는 것
// 변수 선언
var score;
// 이름을 등록하고 값을 저장할 메모리 공간을 확보함 (할당은 하지 않음)
// 암묵적 할당에 의해서 undefined값이 메모리에 할당되서 초기화 됨
console.log(score);
자바스립트 엔진은 변수 선언을 다음과 같은 2단계에 거쳐 수행한다.
일반적으로 초기화란 변수가 선언된 이후 최초로 값을 할당하는 것을 말한다.
var 키워드로 선언한 변수는 undefined로 암묵적인 초기화가 자동 수행된다. 따라서 var 키워드로 선언한 변수는 어떠한 값도 할당하지 않아도 undefined라는 값을 갖는다.
만약 초기화 단계를 거치지 않으면 확보된 메모리 공간에는 이전에 다른 어플리케이션이 사용했던 값이 남아 있을 수 있다. 이러한 값을 쓰레기 값이라 한다.
따라서 메모리 공간을 확보한 다음, 값을 할당하지 않은 상태에서 곧바로 변수 값을 참조하면 쓰레기 값이 나올 수 있다.
var 키워드는 암묵적으로 초기화를 수행하므로 이러한 위험으로부터 안전하다.
식별자를 하용하려면 반드시 선언이 필요하다
선언하지 않은 식별자에 접근하면 ReferenceError(참조에러)가 발생한다.
console.log(host);
var host;
자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 한다.
자바스크립트 엔진은 소스코드의 평가와 소스코드의 실행 과정으로 나누어 처리한다.
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유의 특징을 변수 호이스팅이라고 한다.
변수에 값을 할당(대입, 저장)할 떄는 할당 연산자 =를 사용한다.
변수 선언과 값의 할당의 실행 시점이 다르다!
var score; //변수 선언
score = 80; //변수 할당
var score2 = 80; // 변수 선언과 할당
자바스크립트 엔진은 변수 선언과 값을 할당을 하나의 문단축으로 표현 해도 변수 선언과 값을 할당을 2개의 문의로 나누어 각각 실행한다.
var score;
console.log(score);
var score = 80;
console.log(score);
변수에 값을 할당할 때는 이전 값 undefined에 값을 지우고 저장하는게 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값 80을 저장한다는 점을 주의하자.
재할당: 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것을 말함
var score = 80;
score = 90;
console.log(score);
재할당은 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것이다.
변수에 값을 재할당 하면 새로운 메모리 공간을 확보하고 그 메모리 공간에 값을 저장한다.
윗 예시에서 score는 90값이 들어있는 메모리만을 참조한다. 즉 undefined 와 80이 더이상 필요하지 않다는 것을 의미한다. 이러한 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제 된다.
가비지 콜랙터(garbage collector)
어플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용하지 않는 메모리를 헤제하는 기능을 말한다.
자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 메모리 누수를 방지한다.
var firstname;
var FIRSTNAME;
// 카멜 케이스
var firstName;
// 스네이크 케이스
var first_name;
// 파스칼케이스
var FirstName;
자바스크립트는 일반적으로 변수나 함수에는 카멜케이스를 사용하고
생성자 함수, 클레스에는 파스칼 케이스를 사용한다.