Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1302
- 렉시컬 스코프
- 호이스팅
- 동적계획법
- 비동기처리
- html5
- 1668
- 11399
- 함수 이놈
- 1904
- 탐욕 알고리즘
- 1236
- 9461
- baekjoon
- 백준
- 1931
- 배열같은배열아닌너
- 1568
- 함수 arguments
- Async/Await
- javascript
- 1543
- 함수 parmater
- 11047
- 자류구조
- 유사배열
- 2667
- setTiemOut
- event loop
- 함수 선언문
Archives
- Today
- Total
두치의 개발공부
클로저 본문
클로저를 이해하기 전에 렉시컬 스코프(Lexical Scope)라는 개념을 선행하면 이해가 더욱 쉽습니다!
클로저란 무엇인가?
클로저(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 |