클로저란 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가리킨다.
내부함수와 외부함수
function outter() { // 외부함수
var title = 'coding everybody'; // 외부함수의 지역변수
function inner() { // 내부함수
alert(title); // 내부함수에서 외부함수의 지역변수 접근
}
inner();
}
outter();
* 정적 유효범위와의 차이점을 기억할 것! https://jisun-rea.tistory.com/entry/Javascript-%EC%9C%A0%ED%9A%A8%EB%B2%94%EC%9C%84-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98-%EC%A7%80%EC%97%AD%EB%B3%80%EC%88%98
외부함수가 사용되지 않는 경우에도 내부함수가 외부함수에 접근할 수 있다.
function outter() {
var title = 'coding everybody';
return function() {
alert(title);
}
}
var inner = outter();
inner(); // 외부함수가 종료되었음에도 불구하고
Private variable
function factory_movie(title){ // title 변수를 꼭꼭 숨겨놓고
return {
get_title : function (){ // 가져오는 메소드
return title;
},
set_title : function(_title){ // 변경 메소드
if(typeof _title === 'String') {
title = _title;
} else {
alert('제목은 문자열이어야 합니다.');
}
}
}
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
alert(ghost.get_title()); // Ghost in the shell
alert(matrix.get_title()); // Matrix
ghost.set_title('공각기동대'); // 외부함수의 지역변수를 변경
alert(ghost.get_title()); // 공각기동대
alert(matrix.get_title()); // Matrix
클로저의 응용
var arr = [] // 배열
for(var i = 0; i < 5; i++){
arr[i] = function(){
return i;
}
}
// 0 1 2 3 4 를 기대, 하지만
for(var index in arr) {
console.log(arr[index]()); // 5가 다섯번 출력
}
// 왜냐하면 위의 i값은 외부함수의 지역변수가 아니기 때문이다.
// 수정된 코드
var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(id) { // id 매개변수값에 전달해서
return function(){
return id; // 리턴~
}
}(i); // 전역변수인 i의 값을 받아서
}
for(var index in arr) {
console.log(arr[index]()); // 0 1 2 3 4
}
'Javascript > 기초공부' 카테고리의 다른 글
[Javascript: apply] 함수의 호출 / apply 응용 (0) | 2020.03.17 |
---|---|
[Javascript: Arguments] Arguments란? / function length (0) | 2020.03.17 |
[Javascript: 콜백(Callback)] 콜백의 정의 / 비동기 처리 / Ajax (0) | 2020.03.13 |
[Javascript: 값으로서의 함수] 속성값 / 메소드 / First-class citizen (0) | 2020.03.13 |
[Javascript: 유효범위] 전역변수 / 지역변수 / 전역변수 사용법 / 유효범위의 대상(함수) / 정적 유효범위 (0) | 2020.03.13 |