2-3-1 environmentRecord와 호이스팅

environmentRecord에는 현재 콘텍스트와 관련된 코드의 식별자 정보들이 저장된다. 컨텍스트 내부 전체를 처음부터 끝까지 훑어나가며 순서대로 수집한다. 변수정보를 수집하는 과정을 모두 마쳤어도 아직 실행 컨텍스트가 관여할 코드들은 실행되기 이전이다.그래도 js 엔진은 이미 코드의 변수명들을 모두 알게 된다. 자바스크립트 엔진은 식별자들을 최상단으로 끌어올려놓은 다음 실제 코드를 실행한다고 해도 문제가 전혀 없다. 이것이 호이스팅

호이스팅 규칙

environmentRecord에는 매개변수의 이름, 함수 선언, 변수명이 담긴다.

function a(){
	var b;
	var b = function b () { }

	console.log(b);   //(1)
	b = 'bbb';
	console.log(b);   //(2)
	console.log(b);   //(3)
}
a();	

2번째 줄: 변수 b를 선언한다. 이때 메모리에서는 저장할 공간을 미리 확보하고, 확보한 공간의 주속값을 변수 b에 연결해둡니다.

3번째 줄: 다시 변수 b를 선언, 함수 b를 선언된 변수 b에 할당. 할수는 별도의 메모리에 담기고, 그 함수가 저장된 주솟값을 b와 연결된 공간에 저장.

호이스팅을 고려하지 않은 상태에서 예상하기로는 (1) 에러 또는 undefined, ⑵ ' bbb' , (3) b 함수가 나오리라 생각했지만 실제로는 ⑴ b함수, (2) ‘bbb’, (3) ‘bbb’라는 전혀 다른 결과가 나온다.

함수 선언문과 함수 표현식

함수 선언문은 function 정의부만 존재하고, 별도의 할당 명령이 없는 것을 의미

함수 표현식은 정의한 function을 별도의 변수에 할당하는 것을 말한다.

함수 선언문의 경우 반드시 함수명이 정의되어 있어야 하는 반면, 함수 없어도 된다.

console. log (sum (1,2));
console. log (multiply (3,4));

function sum (a, b) {   // 함수 선언문 sum
    return a+b;
}
var multiply= function (a, b){    // 함수 표현식 multiply
    return a* b;
}