CH.2 실행 컨텍스트
•
실행할 코드에 제공할 환경 정보들을 모아놓은 객체
•
자바스크립트 코드를 실행하는 순간 전역 컨텍스트가 콜 스택에 담긴다.
•
하나의 실행 컨텍스트를 구성할 수 있는 방법으로는 전역공간, 함수 실행이 있다. (eval() 함수는 사용을 지양하는 함수이므로 제외)
•
전역 공간을 둘러싼 외부 스코프가 존재할 수 없으므로 스코프체인 상에는 전역 스코프 하나만 존재함.
•
함수가 호출 되면(선언X 호출ㅇ) 해당 함수의 실행 컨텍스트를 콜 스택에 담는다.
•
콜 스택에 쌓인 컨텍스트들은 위에서부터 실행을 마치고 사라지고, 다시 남아있는 컨텍스트를 실행하는 형태
•
변수 선언만 끌어올리고 할당은 기존 자리에 그대로 남음.
•
함수는 전체를 끌어올린다.
•
var로 선언된 변수의 경우 호이스팅 시 undefined로 변수가 초기화 됨
•
const와 let으로 선언된 변수의 경우 호이스팅이 되어도 변수가 초기화되지 않는다.
•
let과 const로 선언한 변수도 호이스팅 대상이지만, var와 달리 호이스팅 시 undefined로 변수를 초기화하지는 않음. 따라서 변수의 초기화를 수행하기 전에 읽는 코드가 먼저 나타나면 예외가 발생. (참조에러 ReferenceError 발생)
•
호이스팅이 끝난 상태에서의 함수선언문은 함수명으로 선언한 변수에 함수를 할당한 것 처럼 여길 수 있다(=함수표현식)
•
•
함수 선언문 형태 : function abc ();
•
함수 표현식 형태 : let abc = function (); <- 익명 함수 표현식 변수명이 곧 함수명
•
함수표현식이 더 안전한 이유 : 함수 선언문을 사용할 경우, 코드가 길어지고 협업을 할 때에 같은 변수명으로 함수가 할당 되면 호이스팅에 의해 마지막에 할당한 값이 앞의 값들을 덮어씌우는 효과가 발생한다. 따라서 코드를 실행할 때 실제로 호출되는 함수는 마지막에 할당한 함수, 즉 마지막에 선언 된 함수뿐이다. 이 때 함수표현식을 사용했다면 함수를 선언한 후에 호출할 수 있기 때문에 위와 같은 오류를 예방할 수 있다.
•
스코프란 식별자에 대한 유효범위 이다.
•
ES6부터는 전역공간, 함수, 블록에 의해서 스코프 경계가 발생함.
•
var는 블록 스코프를 무시하므로 let, const 사용을 권장함. (함수 스코프 외에 {} 중괄호로 묶인 것이 블록)
•
'식별자의 유효범위'를 안에서부터 바깥으로 차례대로 검색해 나가는 것을 스코프체인 이라고 한다.
•
여러 스코프에서 동일한 식별자를 선언한 경우에는 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능함. 가장 가까운 스코프에서 식별자를 발견하고 나면 찾는 것을 멈춘다.
•
호이스팅에 의해 어떤 함수 또는 블록 내에서 변수 선언 전 출력 코드가 있을 때, 해당 블록 내에 동일한 식별자의 변수가 할당되어 있다면(출력 코드보다 아래에 있더라도) 해당 블록 스코프에서 참조를 하게 되므로 찾기를 멈춘다. 이 때 let을 사용했다면 참조에러가 발생하게 됨.
•
위처럼 함수 내부에서 동일한 변수를 선언하여 전역 공간에서 선언한 동일한 이름의 변수에 접근할 수 없는 것을 변수 은닉화(variable shadowing)이라고 한다.