내부함수가 외부함수의 맥락에 접근할수있는것을 가리킴
내부함수와 외부함수가 무엇인가?
function outter()
{
function inner()
{
var title = 'coding everybody';
alert(title);
}
inner();
}
outter();
var inner = function () { . . . } // outter함수내에 이렇게 선언하고있는거지. 그 함수 안에서만 사용하게되는거임. 응집성을 위해! 이 함수에서만 사용되는거는 그냥 그 안에서 구현하자
여기서 외부함수랑 내부함수가 등장하게되징
만일 title이 외부함수에서 정의되어있다면 inner하는 내부함수에 title이 없으니 이 inner를 포함하는 outter라는 함수에서 title이라는 변수를 찾게됨. 즉 내부함수에서 외부함수의 지역변수에 접근할 수 있어. 이런걸 클로저라고 함.
외부함수가 사용되지 않아도 내부함수가 사용될수있다는게 흥미로운 점이야
function outter()
{
var title = 'coding everybody';
return function() {
alert(title);
}
}
var inner = outter();
inner();
=> coding everybody가 경고창에 호출됨...
outter()라는 함수는 내부함수를 리턴하잖아. 리턴을했다는건 그 함수는 종료되었다는거야. 그럼에도 불구하고 우리가 inner라는 함수를 호출한 순간에 이미 아우터는 생을 마감했음에도 불구하고 inner()가 동작하는게 이상하잖아. 즉 외부함수는 이미 죽었는데 그 외부함수로 인해 파생된 내부함수는 성공적으로 전달되서 살아남고 그걸 호출하면 외부함수의 데이터인 title을 성공적으로 가지고와서 업무를 수행할수있게됨..무슨 영혼처럼
이게 바로 클로저의 독특함임.
내부함수를 포함하는 외부함수에 접근할수있을뿐만아니라 그게 종료됬음에도 접근할수있다는게 큰 특징
어떤 이유로 우리가 이런 코드를 작성하는것일까?
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());
비밀변수. get과 set은 언제든지 접근할수있는 메소드임. 그런데 get과 set이 사용하는 title은 외부변수의 지역변수임. 지역변수인 title은 이미 생을 마감했기때문에 내부함수의 get과 set으로만 접근할수있는 변수 즉 private변수가 됨.
소프트웨어 커지면 많은사람들의 손을 대게됨. 많은 데이터가 존재하는데 그 데이터가 누구나 수정할수있는 데이터가 된다는것은 결국 그 소프트웨어가 망가질 가능성이커짐.