[TIL] 딥다이브 자바스크립트 01 변수

normalduck·2022년 1월 18일
0

TIL

목록 보기
7/7

var 키워드의 단점 블록 레벨 스코프를 지원하지 않고 함수레벨 스코프를 지원함.
이로 인해 의도치않은 전역 변수가 선언되어 심각한 부작용이 발생함
ES6 let과 const 키워드를 도입한 이유 var 키워드의 단점을 보완하기 위해서.

var score;

키워드는 자바스크립트 코드를 해석하고 실행하는 자바스크립트 엔진이 수애할 동작을 규정한 일종의 명렁. 자바스크립트 엔진은 키워드를 만나면 자신이 수행해야할 약속된 동작을 수행함. ex) var 키워드를 만나면 자바스크립트 엔진은 뒤에 오는 변수이름으로 새로운 변수를 선언함. 변선 선언문은 다음과 같이 변수 이름을 등록하고 값을 저장할 메모리 공간을 확보함.

undefined라는 값이 암묵적으로 할당되어 초기화됨.
-> 자바스크립트에서 제공하는 원시 타입의 값.

자바스크립트 엔진은 변수 선언을 2단계에 걸쳐서 수행함.

선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알림.
초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화함.

변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록됨.
실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역임..

변수 이름과 변수 값은 실행 컨텍스트 내에 키 값 형식인 객체로 등록되어 관리됨.
우선 자바스크립트 엔진이 변수를 관리할 수 있도록 변수의 존재를 알리는 정도만 알아두자!

var 키워드를 사용한 변수 선언은 선언 단계와 초기화 단계가 동시에 진행됨.

초기화 단계를 거치지않으면 확보된 메모리 공간에 이전에 다른 애플리케이션이 사용했던 값이 남아있을 수 있음. 이런걸 쓰레기 값이라함. 값을 할당하지 않은 상태에서 곧바로 변수 값을 참조하면 쓰레기 값이 나올수 있음. 자바스크립트의 var 키워드는 암묵적으로 undefined를 값을 할당 = 초기화 하므로 이런 위험에서 안전함

변수를 사용하려면 반드시 선언이 필요함.
변수 뿐만 아니라 모든 식별자 (함수, 클래스 등)이 그럼. 만약 선언하지 않은 식별자에 접근하면 참조 에러가 발생함. referfenceError 참조에러는 식별자를 통해 값을 참조하려 했지만 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을때 발생하는 에러임.

4.4

변수 선언의 실행 시점과 변수 호이스팅

console.log(score)
var score

score에 undefined가 뜨는 이유 변수 선언이 소스코드가 한 줄씩 실행되는 시점, 즉 런타임이 아니라 그 이전 단게에서 먼저 실행되기 때문임.

자바스크립트 엔진은 소스 코드를 한줄씩 순차적으로 실행하기 전 소스코드의 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 함.

이때 소스코드 실행을 위한 준비 단게인 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문(변ㄴ수 선언문, 함수 선언문 등) 을 소스코드에서 찾아내 먼저 실행함. 그리고 소스코드의 평가과정이 끝나면 비로소 변수 선언을 포함한 모든 선언문을 제외하고 소스코드를 한줄씩 순차적으로 실행함.

즉 자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있든 상관없ㅇ이 먼저 실행함.
따라서 변수 선언이 소스코드의 어디에 위치하는지와 상관 없이 변수를 참조할 수 있음..

이처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라함.

변수 선언 뿐만 아니라 function class 키워드를 사용해서 선언하는 모든 식별자는 호이스팅 된다!!! 모든 선언문은 런타임 이전 단계에서 먼저 실행 되기 때문이다!!!!!

4.5 값의 할당

변수에 값을 할당할때는 할당 연산자를 사용한다. 할당 연산자는 우변의 값을 좌변의 변수에 할당한다

var score;
score = 80;

변수 선언과 값의 할당을 다음과 같이 하나의 문으로 단축 표현할수도있다.
var 키워드로 선언한 변수는 값을 재할당할 수 있다.
재할당은 현재 변ㄴ수에 저장된 값을 버리고 새로운 값을 저장하는 거임.
var 키워드로 선언한 변수는 선언과 동시에 undefined로 초기화되기 때문에 엄밀히 말하면 변수에 처음으로 값을 할당하는것도 재할당이다.

값을 재할당할 ㅜ 없는 것은 상수다.
단 한 번만 할당할 수 있다.

이렇게 할당되고 난 후 버려진 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.언제 해제될지는 예측 불가능!!!

식별자는 네이밍 규칙이 있다!
숫자로 시작하면 안된다. 예약어x 특수문자 x
_, $는 가능하다.

일반적으로
ㅂㄴ수나 함수의 이름에는 카멜 케이스
ex) firstName
생성자 함수, 클래스 이름엔 파스칼 케이스
FirstName

var score= 80;

두개는 똑같다. 단추 ㄱ표현해도 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.

이때 주의할 점은 변수 선언과 값의 실행의 시점이 다르나든 것이다. 변수 선언온 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.

profile
작심삼일도 33.333333···번 반복하면 100 번이 됩니다.

0개의 댓글

관련 채용 정보