https://ko.javascript.info/closure
-수정중-
클로저는 외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수를 의미
자바스크립트는 함수 지향 언어. 함수를 동적으로 생성할 수 있고, 생성한 함수를 다른 함수에 인수로 넘길 수 있으며, 생성된 곳이 아닌 곳에서 함수를 호출할 수도 있기 때문입니다.
함수 내부에서 함수 외부에 있는 변수에 접근할 수 있다는 사실!
####클로저를 이용하여 합 구하기
sum(a)(b) = a+b와 같은 연산을 해주는 함수 sum을 두 개의 괄호를 사용해서 만들어보세요
ex) sum(1)(2) = 3
sum(5)(-1) = 4
function sum(a){
return function(b){
return a + b ;
}; //a는 외부 렉시컬 환경에서 가져옴
}
alert(sum(1)(2)); //3
코드 블록 {...} 안에서 선언한 변수는 블록 안에서만 사용할 수 있다.
for (let i = 0; i < 3; i++) {
// 변수 i는 for 안에서만 사용할 수 있습니다.
alert(i); // 0, 1, 2가 출력
}
alert(i); // ReferenceError: i is not defined
let i는 {...} 밖에 있긴 하지만 for 옆 괄호 안에서 선언한 변수는 블록 {...}에 속하는 코드로 취급된다는 점에서 조금 특별합니다.
1.
function sayHiBye(firstName, lastName) {
function getFullName() {
return firstName + " " + lastName;
}
alert( "Hello, " + getFullName() );
}
2.
function sayHiBye(firstname, lastname){
alert("Hello,"+firstname+" "+lastname);
}
자바스크립트에선 실행 중인 함수, 코드 블록 {...}, 스크립트 전체는 렉시컬 환경(Lexical Environment) 이라 불리는 내부 숨김 연관 객체(internal hidden associated object)를 갖는다.
렉시컬 환경 객체는 두 부분으로 구성
1. 환경 레코드(Environment Record) - 모든 지역 변수를 프로퍼티로 저장하고 있는 객체
2. 외부 렉시컬 환경(Outer Lexical Environment)에 대한 참조 - 외부 코드와 연관
변수는 환경 레코드의 프로퍼티일 뿐. '변수를 가져오거나 변경하는 것'은 '환경 레코드의 프로퍼티를 가져오거나 변경'함을 의미