JavaScript에서 호이스팅(hoisting)이란 인터프리터가 변수와 함수의 메모리 공간 선언 전에 할당하는 것을 의미한다.
좀 더 쉽게 말하자면 자바스크립트에서 물 흐르는 것처럼 위에서 아래로 실행되는데 호이스팅이란 미리 선언한 변수와 함수를 쭉 읽으며 가져가서 메모리에 기억을 해둔다. 즉, 함수가 실행되기 전에 안에 있는 변수들을 범위의 최 상단으로 끌어올리는 것이다.
var
호이스팅시 변수의 선언과 초기화(undefinded) 같이 시키고 값 할당은 나중에 그 줄 가서 할당을 한다.
console.log(a) //undefinded
var a = 1
console.log(a)//1
전역변수(블락 밖에서 선선을 한 어디든 쓰일 수 있는 변수)와 지역변수(블락 안에서 선언된 변수, 블락 안에서만 쓸 수 있음)의 개념이 확실치 않고 함수만 지역변수로 호이스팅이 되고 나머지는 다 전역변수로 올려버린다. 변수의 이름이 중복이 된다.
let
let 도 호이스팅이 된다. 다만, let 의 변수는 TDZ(Temporal Death Zone)라는 일시적으로 죽은 범위의 개념을 만들어서 #선언문이 나오기 전까지 #에 접근할수 없도록 했다.

단점으로는
장점으로는
- 메모리 효율이 좋다.
- 코드 변경시 빌드 과정없이 바로 실행이 가능
→대표적인 언어에는 Python, R, Ruby
컴파일? compile 단어의 자체 뜻은 모아서 묶음으로 만든다고 하는데 프로그램에서의 단어의 뜻은 프로그램 전체를 스캔하여 이를 모두 ~ 기계어로 번역한다는 뜻이 있다.
→ 컴파일러(Comiler)를 사용하는 대표적인 언어에는 C, C++, C#, CLEO, COBOL 등 있고 게 컴파일러를 사용하여 실행하는 언어를 컴파일러형 언어(Compiled Language) 라고 한다!
*변수?데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간
