[25] Closure
1. closure란?
폐쇄적인(Closure) 공간의 데이터를 사용할 수 있게해주는 자바스크립트 문법
2. closure사용법
if(1<2) {
let a = function(){
let abc = 123;
}
a();
console.log(abc)
}
=== abc is not defined
console.log(abc)
가 사용되면 console.log(abc)
가 속한 if(1<2){}
함수에서 abc를 찾게 됨
하지만 이때 탐색대상에서 let a = function(){}은 제외가 됨
이유는 찾고자 하는 괄호 안에 또 괄호가 있으면 제외가 되고 없다라고 생각을 함
즉 함수가 실행되고 난 다음 시점에는 그 안에서 사용된 변수는 사용할 수가 없음
자바스크립트 내부에서는 메모리에 let abc = 123이 입력된 시점에서 할당이 되었으나 접근할 방법이 없어지면 굳이 메모리를 할당해서 데이터 낭비를 할 필요가 없기 때문에 메모리에서 제외시킨다(쓸모없는 자료가 됨)
그런데 이 변수를 함수 밖에서 사용할 수 있다면 매우 좋을 거 같음
if(1 < 2) {
let a = function(){
let abc = 123
let ddd = function(){
return 55
}
return ddd
}
let ccc = a()
console.log(ccc())
}
=== 55가 나옴
if(1 < 2) {
let a = function(){
let abc = 123
let ddd = function(){
return abc
}
return ddd
}
let ccc = a()
console.log(ccc())
}
=== 123이 나옴
Why?
let ccc = a()
가 실행이 되면
let a = function(){}
가 실행이 됨
let a = function(){}
의 안에 let ddd = function(){}
이 실행이 되며 그 안에 return abc
가 실행이 되는데 abc
를 찾으려고 보니 let ddd = function(){}
의 범위 내에서 찾을 수가 없음
그러니까 ScopeChain에 의해서 상위 함수로 넘어가고 let abc = 123
을 찾고 그 값을 반환하여 let a = function(){}
의 내부의 return ddd
가 실행이 됨
ccc()
를 실행하게 되면 결국 let a = function(){}
의 내부인 let ddd = function(){}
가 실행이 됨
그렇기 때문에 let a = function(){}
의 폐쇄적인(Closure) 공간의 데이터를 사용할 수 있게 되면서 자바스크립트 내부에서 데이터가 지워지지 않고 살아 있을 수 있다.
Author And Source
이 문제에 관하여([25] Closure), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@acwell94/25-Closure저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)