본문 바로가기

Js

변수 선언과 실행, 호이스팅(hoisting)

자바스크립트의 변수 선언과 값의 할당은 조금 특이하다.

 

가령

  console.log(score);

  var score;

이런 코드가 있다고 하자

 

score라는 변수는 선언되기 전에 console.log함수에 의해 참조된다.

따라서 reference error가 발생할 것이라고 생각할 수 있다.

 

변수를 선언하는 평가과정과 선언문을 제외한 코드를 실행하는 실행과정이 분리되어 있기 때문에 reference error는 발생하지 않는다.

 

위에 코드를 실행해보면 undefined가 콘솔창에 출력된다.

변수를 선언할 때 평가과정에서 undefined로 초기화(initialize)하기 때문이다.

 

이처럼 변수의 선언문이 위로 끌어 올려진 것처럼 보이는 것을 변수 호이스팅(hoisting)이라고 한다.

JS에서는 변수선언문이 어디있던 간에 상관없이 다른코드보다 먼저 실행된다.

 

값의 할당

가령

  var score = 80;

이런 변수 선언문이 있다고 하자 이 선언문은 값의 할당까지 하나의 문으로 단축표현하였다.

 

이 코드는 아래 코드와 정확히 동일하게 동작한다.

  var score;

  score = 80

 

제일 먼저 코드를 실행하기 전에 변수선언 및 함수선언문 등을 먼저 실행한다.

위 코드에서는 score라는 변수를 선언하고 undefined로 초기화한다.

코드의 평가단계가 끝나고 선언문을 제외한 코드가 한줄 씩 실행되는 데, 이때 score값에 80이라는 값이 할당(assignment)된다.

 

원시값의 설명에서 나오지만 undefined값은 수정불가능한 원시값으로 수정하지 않고 80이라는 값을 새로운 메모리 공간을 할당하여 넣은 후 score라는 식별자가 그 메모리를 참조한다.

 

unmanaged언어와 managed언어

c언어와 같이 개발자가 명시적으로 메모리를 할당, 해제할 수 있는 언어를 unmanaged언어라고 한다.

개발자의 역량에 따라 최적화가 가능하다.

 

JS와 같이 개발자의 직접적인 메모리 제어를 막는 언어를 managed언어라고 한다. 메모리 관리기능을 언어차원에서 담당한다.

 

naming convention in js

변수, 함수 : camelCase

생성자 함수, 클래스 : PascalCase

 

추가적인 나의 이야기

c언어같은 경우는 변수를 선언하고 값을 할당하지 않으면 쓰레기값이 할당된다.

만약 포인터형 변수의 쓰레기값을 dereferencing한다면 참사가 벌어질 수 있을 것이다.

Js에서는 이러한 실수를 막고자 평가단계에서 undefined로 초기화를 하는 것 같다.

 

참고: 자바스크립트 딥다이브

'Js' 카테고리의 다른 글

JS / javascript / Promise  (3) 2024.12.30
Js / javascript 문법 / async/await 비동기 처리 키워드  (3) 2024.12.30
단축평가(short circuit)  (3) 2023.05.03
데이터 타입  (3) 2023.01.04
표현식과 문  (3) 2023.01.02