Open eunzy38 opened 4 years ago
// ----------------------------(1)
let a = 1;
function outer() {
function inner() {
console.log(a); // undefined
let a = 3;
}
inner(); // ---------------(2)
console.log(a); // 1
}
outer(); // -------------------(3)
console.log(a); // 1
변수 선언 부분을 먼저 실행
함수 선언문 function 정의부만 존재하고 별도의 할당 명령이 없는 것
function a(){.....}
a(); //실행
함수표현식 정의한 function을 별도의 변수에 할당하는 것
var b = function() {...} // 익명 함수 표현식
b(); //실행
var c = function d() {..} //기명 함수 표현식
c() //실행
d() //에러
함수선언문과 함수 표현식의 차이 함수 선언문은 함수 전체를 호스팅하는 반면 함수 표현식은 변수 선언부만 호이스팅한다.
스코프 식별자에 대한 유효 범위 자바스크립트는 전역공간을 제외하면 함수에 의해서만 스코프 생성
전역변수 전역공간에서 선언한 변수
지역변수 함수 내부에서 선언한 변수
2-3 LexicalEnvironment LexicalEnvironment 내부는 environmentRecord와 outer-environmentRecord로 구성
2-3-1 environmentRecord와 호이스팅
2-3-2 스코프, 스코프 체인, outerEnvironmentReference
변수와 함수(전체) 선언을 끌어올려 먼저 실행함
function a ( ) { /* ... */ } // 함수 선언문, 함수명 a가 곧 변수명
a( ); // 실행 OK
var b = function ( ) { /* ... */ } // (익명) 함수 표현식, 변수명 b가 곧 함수명
b( ); // 실행 OK
익명 함수 표현식 함수명을 정의하지 않은 함수 표현식 (일반적으로 많이 쓰임)
var c = function d ( ) { /* ... */ } // 기명 함수 표현식, 변수명은 c, 함수명은 d c( ); // 실행 OK d( ); // error
기명 함수 표현식 함수명을 정의한 함수 표현식 함수명은 오직 함수 내부에서만 접근 가능 (외부에서 함수명으로 함수를 호출할 수 없음)
함수 선언문은 함수 전체를 호이스팅 하는 반면, 함수 표현식은 변수 선언부만 호이스팅 함
식별자에 대한 유효범위 ES5까지의 자바스크립트는 전역공간을 제외하면 오직 함수에 의해서만 스코프가 생성됨
전역변수 : 전역 공간에서 선언한 변수 지역변수 : 함수 내부에서 선언한 변수
LexicalEnvironment
environmentRecord와 호이스팅
함수선언문과 함수 표현식
스코프
environmentRecord와 호이스팅
함수선언문과 함수 표현식
스코프
스코프 체인
전역변수
지역변수
this
LexicalEnvironment
1. environmentRecord와 호이스팅
함수 선언문과 함수 표현식
스코프, 스코프체인, OuterEnvironmentReference
전역변수와 지역변수
렉시컬 환경은 세가지 일을 한다. (VariableEnvironment도 동일) 1. Environmnet Records lexical environment 안에 함수와 변수를 기록한다.
2. Reference to the outer environment 외부 환경으로의 참조 값의 의미는 외부 lexical 환경으로 접근할 수 있다는 의미이다. 자바스크립트 엔진이 현재의 lexical environment에서 변수를 찾지 못했다면 외부 환경에서 해당 변수를 찾아 볼 수 있다는 의미이다.
3. This binding this의 값이 여기서 결정된다. 글로벌 실행 컨텍스트에서 this는 global object 이다. 함수 실행 컨텍스트에서는 this 값은 어떻게 함수가 호출되었는지에 따라 달라진다. 만약 함수가 object reference로 호출되었다면 this는 해당 객체를 가리키게 된다. 그렇지 않으면 this는 글로벌 객체(window)를 가리키거나 strict mode에서는 undefined를 가리키고 있다.
study 완료 후 체크 부탁드립니다.