새로운 객체의 프로퍼티 형태나 중첩 함수 그 자체로 반환 될 수 있음.
반환된 중첩함수는 어디서든 호출해서 사용 할 수 있음.
외부 변수에 접근할수있다는 사실은 변함 없음
function sayHiBye(firstName,lastName){
function getFullName(){
return firstName + " " + lastName;
}
alert( "Hello, " + getFullName() );
alert( "Bye, " + getFullName() );
}
function makeCounter(){
let count = 0;
return function(){
return count++;
};
}
let counter = makeCounter();
alert(counter());
//0
alert(counter());
//1
alert(counter());
//2
실행중인 함수, 코드블록 {...} 스크립트 전체는 "렉시컬 환경" 이라 불리는 "내부숨김연관객체"를 갖는다.
렉시컬환경객체
변수는 "환경 레코드의 프로퍼티" 일 뿐이다.
변수를 가져오거나 변경 하는 것은 "환경 레코드의 프로퍼티틑 가져오거나 변경함을 의미"
execute start --- phrase:<uninitialized>
let phrase ---- phrase : undefined
phrase = "hello" ---- phrase : "hello"
phrase = "Bye" ---- phrase : "Bye"
스크립트가 실행되면 "스크립트 내" 선언한 변수 전체가 --> 렉시컬 환경에 올라감
let phrase : 프로퍼티 값은 undefined
phrase에 값이 할당 됐음.
phrase의 값이 변경됐음.
정리 : 변수는 환경 레코드의 프로퍼티이다.
환경 레코드는
변수를 변경하면 환경 레코드의 프로퍼티 변경
함수 선언문으로 선언한 함수는 일반 변수와는 달리 바로 초기화된다.
함수 선언문으로 선언한 함수는 렉시컬 환경이 만들어지는 "즉시" 사용가능
변수는 let를 만나 선언이 될 때까지 사용 x (함수와 변수의 차이점)
선언 되기도 전에 함수를 사용 할 수 있음.
let phrase = 'hello';
function say(name){
alert(`${phrase}`)
}
초기에
phrase : <uninitialized>
say : function
바로 초기화 되는 것을 볼 수 있음.
let phrase = 'hello';
function say(name){
alert(`${phrase}`)
}