티스토리 뷰
클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다. 클로저는 자바스크립트를 이용한 고난이도의 테크닉을 구사하는데 필수적인 개념으로 활용된다.
-> 어려움 : 보고 정의를 봐라
먼저 내부함수와 외부함수를 이해해야한다.
내부함수
<script>
function outter() {
function inner() {
var title = 'coding everybody';
alert(title);
}
inner();
}
outter();
</script>
결과 : coding everybody
어떠한 함수가 있는 함수안에서만 사용? 함수 밖에 선언하면 응집성이 떨어짐 함수안에다 선언하면 그 함수안에만 사용기에 안에 선언한다.
작은 박스 내부 큰 박스 외부
클로저
<script>
function outter() {
var title = 'coding everybody';
return function () {
alert(title);
}
}
inner = outter();
inner();
</script>
내부 함수를 리턴하고있다. 아웃터라는 외부함수를 실행한 결과는 inner에 담음 inner를 호출 하면 coding everybody를 출력하게 된다.
내부함수는 이미 죽었는데 뭐래 하나도 모르겠어;
내부함수를 포함하고있는 외부함수에 접근할 수 있을 뿐 아니라 외부함수를 통해 내부에 접근할 수 있다.
조금더 실용적인 예제래;
<script>
function factory_movie(title) {
return {
get_title: function () {
return title;
},
set_title: function (_title) {
title = _title
}
}
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
alert(ghost.get_title());
alert(matrix.get_title());
ghost.set_title('공각기동대');
alert(ghost.get_title());
alert(matrix.get_title());
</script>
Matrix 값이 나옴
_title은 -> title을 가르킴 그래서 결국 매개변수를 가르킴
ghost. / matrix. 출력값을 확인함 첫번째 고스트 두번째 메트릭스
그래서 matrix로 감
실수 방지
자주 실수하는 예제 유명한 예제래
<script>
var arr = []
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}
}
for (var index in arr) {
console.log(arr[index]());
}
</script>
포인 문을 이용해서 배열에 담겨있는 값을 하나하나 꺼낸 후에 함수를 호출하면 console.log( i );가 샐행된다.
0 - 4 까지가 호출되어야한다. 하지만 5가나오는데? 그래서 return으로 바꿈 그러나 5가 나옴
이유는?
외부함수를 정의하고 내부함수가 참조하도록해야함
고급개발자되려면 이걸 반드시 익혀야한다는데 너무 어렵네연
'코딩 공부 > 생활 코딩' 카테고리의 다른 글
생활 코딩 - 함수의 호출 (1) | 2021.08.18 |
---|---|
생활 코딩 - arguments (0) | 2021.08.18 |
생활 코딩 - 값으로서의 함수와 콜백 (0) | 2021.08.18 |
생활 코딩 - 유효범위 (0) | 2021.08.18 |
생활 코딩 - 객체 (4) | 2021.08.17 |
댓글
© 2022 chanchaning