For Programmer
자바스크립트 - 클로저 본문
클로저의 기본
*클로저: 간단히 말해서 어떤 함수의 내부 함수를 뜻한다.
* outter()함수에만 사용할 필요가 있는 메서드가 있을 경우 내부함수로 만들 필요가 있다.(그것을 동등한 위치의 외부함수로 만들경우 코드의 시각성이 떨어짐) 이때 내부함수에서 외부함수의 지역변수에 접근이가능한데 이것이 클로저함수의 특성이다.
클로저 함수의 독특성
* 외부함수(outter)가 inner라는 변수에 값을 반환하고 소멸하였는데도 ouuter의 내부함수 즉 클로저함수는 그 환경을 기억한다. title에는 'codding everybody'가 대입이 되어서 기억이된 상태를 말한다. 다시 설명하자면, 위의 코드를 보면 inner라는 변수에 outter함수의 반환값을 대입하여 inner에는 function() { alert(title) } 가 대입된다. 그러나 원칙적으로 outter()함수는 대입한 후 소멸하기 때문에 inner라는 변수의 title이라는 것은 출력시 undefined가 되어야 정상이다. 그러나 클로저 함수는 자신의 환경을 기억하기 때문에 title이 'coding everybody' 대입되어있는채로 inner변수에 대입이된다. 따라서 inner();로 마지막에 함수를 실행시켜 보면'coding everybody'가 출력이 정상적으로 된다. 즉, 정리하면 클로져함수는 자신의 환경을 기억한다는 사실만 알면된다.
클로저 함수의 사용이유
*클로저의 함수의 사용이유는 단적으로 말하면 변수의 은닉화 즉, 외부에서 변수를 마음대로 바꾸지못하게 하기 위해서이다. 자바에서는 이미 세터와 게터라는 함수가 존재한다. 즉, 세터와 게터라는 함수를 이용해야만 해당변수에 접근하고 얻을 수있다. 이를 자바스크립트에서는 클로저를 이용해서 사용하고있다.
*위의 코드를 보면 각각의 변수(ghost,matrix)에 원하는 영화제목('Ghost in the shell , Matrix)'을 대입하고 있다. 하지만 이러한 변수의 이름을 어떠한 내부 메서드를 통하지않고 그냥 변경할 수있다면 얼마나 보안이 취약하겠는가? 이를 클로저함수를 통해서 get_title,set_title이라는 메서드를 통해서만 변경할 수있도록 코딩을 해놓은것이다. 이는 데이터양이 많으면 많아질수록 그중요성 또한 커진다. 만약 이러한 장치가 없다면 코드가 수없이 길어졌을때 누군가의 실수하나로 변수가 쉽게 바뀐다면 그또한 어마어마한 에러를 가져올 수있기 때문이다.
클로저 함수의 예시(고급)
*첫번째 출력에서는 5만 5번 출력이된다. 상식적으로 생각하면 0~4 가나와야하는데 그이유가 뭘까? 그 답은 클로저함수의 사용유무에있다. 첫번째는 클로져함수를 사용하지 않으면 그 환경을 기억을 하지않는다. 즉 첫번째 함수 내부의 arr[0] ~ arr[4] 까지는 function(){ return i } 라는것이 대입이되고 반복문이 끝난다음에 이를 출력해보면 5가 5번 출력이된다. 즉, 반복문이 도는동안에는 fuction(){ return i }에서 i값이 결정이 되지않는다는 것이다.
*이를 해결하기 위해 클로저함수를 사용하는데 외부 함수로 감싸고 i값을 인자로 받는것이다. 위의코드에서 2번째가 클로저함수인데 익명함수로 바로 실행하여 i값을 넘기면 외부함수는 이를 id로 받아서 클로저함수는 내부환경을 기억하기때문에 return id값이 i값으로 매 반복문실행마다 결정이 된다.
'Programming language > JavaScript' 카테고리의 다른 글
자바스크립트 - apply함수 (0) | 2020.07.19 |
---|---|
자바스크립트 - arguments함수 (0) | 2020.07.19 |
자바스크립트 - 함수의 다양한 활용 (0) | 2020.07.19 |
자바스크립트 -전역변수와 지역변수(var사용:ES5문법) (0) | 2020.07.18 |
자바스크립트 - 정규표현식 (0) | 2020.07.18 |