2020-12-9 JS 클로저
클로저
-
클로저를 이해하기 위해서는 일급객체, 변수범위, 중첩함수를 알아야한다.
-
일급객체란 인자와 함수의 리턴값으로 사용, 수정되고 변수에 할당하는 것을 포함한다. JS에서 클로저를 만들기 위해서는 함수를 변수에 대입하고 리턴값으로 리턴하는 작업이 필요하기 때문이다.
-
변수범위 : JS의 변수들은 지역, 전역의 범위를 가진다. 함수내에 정의한 변수는 지역변수이고, 함수내에서만 사용이 가능하다. 함수 밖에 속한 변수는 전역변수로 윈도우(window)객체에 속한다.
-
let name = "jimmy"; function printName() { let name = "hello"; console.log(name); } printName(); console.log(name); // hello // jimmy
- 같은 이름을 가진 지역변수, 전역변수가 존재할때 이는 서로 다른 변수이다. 함수내에서 전역변수와 같은 이름의 지역변수를 정의하면 전역변수가 가려지기 때문이다. 함수내부에서 var키워드를 사용하지 않으면 전역변수
-
-
변수의 수명은 전역변수는 윈도우, 웹페이지가 살아있는 동안, 지역변수는 함수가 생성되고 리턴될때 지워진다.
-
중첩함수는 함수내에서 함수를 정의하고 사용하는 것을 말한다.
-
var global_name = "global"; function printName() { var outer_name = "outer"; function showName() { var inner_name = "inner"; console.log(global_name); console.log(outer_name); console.log(inner_name); } showName(); } printName(); // result global outer inner // case2 var global_name = "global"; function printName() { var outer_name = "outer"; function showName() { var inner_name = "inner"; console.log(global_name); console.log(outer_name); console.log(inner_name); } return showName; } var print = printName(); print(); // result global outer inner
-
js는 함수를 일급객체로 취급하기 때문에 함수를 변수에 저장하고 반환할 수 있다.
-
위의 예시에서 var print = printName()으로 반환받은게 클로저이다. 여기서 특징 printName()함수 내에서 정의된 지역변수인 outer_name이 자신의 수명이 끝나는 printName()을 호출 후에 print()를 해도 살아있다는 점이다.
- 클로저는 자신을 포함하고 있는 외부함수의 인자, 지역변수 등을 외부함수가 종료된 후에도 사용할 수 있다. 이런 변수를 자유변수라고 한다. 자유변수를 가진 코드를 클로저라고 한다.
-
-
익명함수 사용예시
-
function makeGreeting(name) { var greeting = "hello"; return function() { console.log(greeting + name); } } var g1 = makeGreeting("jimmy"); g1(); // result hello jimmy
- 여기서도 makeGreeting()의 인자와 내부의 지역변수 모두 캡쳐되서 자유변수가 됬다.
-
-
즉시실행함수를 통해 페이지당 하나만 설정할수도 있다.
-
함수표현식을 사용하면 클로저와 콜백으로 사용될 수 있다.
Written on December 9, 2020