일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- html5
- 11399
- 호이스팅
- 렉시컬 스코프
- 비동기처리
- 함수 이놈
- 자류구조
- setTiemOut
- event loop
- 11047
- 1568
- 9461
- 1904
- 탐욕 알고리즘
- 배열같은배열아닌너
- Async/Await
- 1543
- 2667
- 1668
- 유사배열
- 1931
- 함수 parmater
- 백준
- 동적계획법
- 1302
- 함수 arguments
- javascript
- 1236
- 함수 선언문
- baekjoon
- Today
- Total
두치의 개발공부
클로저 본문
클로저를 이해하기 전에 렉시컬 스코프(Lexical Scope)라는 개념을 선행하면 이해가 더욱 쉽습니다!
렉시컬 스코프(Lexical Scope)
렉시컬 스코프(Lexical Scope)란? 함수를 어디서 호출하였는지가 아니라 어디에서 선언하였는지에 따라 함수의 결과가 결정되는 것을 말합니다. => 함수가 어디서 선언되었는지에 따라 상위 스코
flex-developer.tistory.com
클로저란 무엇인가?
클로저(closure)는 내부 함수가 스코프에 묶인 외부 함수의 변수에 접근 할 수 있는 개념을 말합니다.
자바스크립트의 고유 개념은 아니고 함수형 프로그래밍 언어에서 사용되는 특징 중 하나입니다.
클로저 예시
예시를 통해서 알아보도록 하겠습니다.
function outer() { // 외부함수
var count = 0;
function inner() { // 내부함수
count++;
console.log(count);
}
return inner; // 함수를 반환
}
var inner = outer(); // 외부 함수는 소멸됨.
inner();
inner();
inner();
outer 함수는 inner 라는 변수에 할당되면서 소멸하였지만, inner를 실행하면 outer함수 내에 선언된 변수 count를 사용할 수 있습니다.
어떤 논리일까?
외부함수가 소멸되어도 내부함수가 생성될 당시의 환경을 기억하고 있기 때문에 외부함수의 변수에 접근이 가능한 것 입니다.
클로저는 반환된 내부 함수가 자신이 선언되었을 때의 렉시컬 환경을 기억하고 있어 다른 환경에서 호출되어도 그 환경에 접근 할 수 있는 함수입니다!
어디에 사용될까?
제 개인적인 생각으로 클로저는 자바스크립트에서 이해하기 까다로운 개념에 속하는 거 같습니다.
이 까다로운 클로저는 어디에 사용되는지 알아보겠습니다.
- 캡슐화, 은닉화
자바스크립트는 Java와 같은 접근 수정자(private, public, protected)가 존재하지 않기 때문에 접근 불가한 속성을 만들수가 없습니다.
※자바스크립트에서 변수명 앞에 _를 명시하는 네이밍법은 접근제어자 private의 특성이 적용되어야 하는 변수나 함수 앞에 그것을 명시하는 관습이 있습니다.
function Hello(name) {
this._name = name;
}
Hello.prototype = {
sayHello: function () {
return `Hello ${this._name}`;
},
setName: function (name) {
this._name = name;
},
};
var temp = new Hello("Duchi");
console.log(temp._name); // 'Duchi'
console.log(temp.sayHello()); // 'Hello Duchi'
temp.setName("Bbuggu");
console.log(temp._name); // 'Bbuggu'
console.log(temp.sayHello()); // 'Hello Bbuggu'
외부에서 _name 변수에 자유롭게 접근이 가능한 것이 보입니다.
이제 _name 변수를 클로저를 통해서 숨겨보도록 하겠습니다.
function Hello(name) {
_name = name;
return {
sayHello: function () {
return `Hello ${_name}`;
},
setName: function (name) {
_name = name;
},
};
}
var temp = new Hello("Duchi");
console.log(temp._name); // undefined
console.log(temp.sayHello()); // 'Hello Duchi'
temp.setName("Bbuggu");
console.log(temp._name); // undefined
console.log(temp.sayHello()); // 'Hello Bbuggu'
이제 외부에서 _name 에 접근 할 수 없게 되었습니다.
참고 문서
'언어 > JavaScript' 카테고리의 다른 글
함수 아규먼츠(arguments) (0) | 2022.02.20 |
---|---|
호이스팅 (0) | 2022.01.09 |
setTimeout vs setInterval (0) | 2022.01.09 |
비동기 처리 (0) | 2022.01.09 |
유사배열 (0) | 2022.01.09 |