///////
Search
Duplicate

김은총

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