코드스테이츠 3주차 / 클로저

support·2021년 10월 30일
0
post-thumbnail

✏️Achievement Goals

✅ 클로저 함수의 정의와 특징에 대해서 이해할 수 있다
✅ 클로저가 갖는 스코프 범위를 이해할 수 있다
✅ 클로저를 이용해 유용하게 쓰이는 몇 가지 코딩 패턴을 이해할 수 있다

📝summary

클로저 : 내부함수가 외부함수의 맥락에 접근할수 있는것
mdn : 함수와 함수가 선언된 어휘적(lexical) 환경의 조합을 말한다.
이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다.(함수와 렉시컬 환경의 조합)

클로저의 특징

  1. 클로저 함수는 "함수를 리턴하는 함수" 함수를 리턴하는 함수가 클로저의 형태를 만든다

  2. "내부 함수는 외부 함수에 선언된 변수에 접근 가능하다"

  3. 함수가 생성될 당시의 외부변수를 기억
    생성 이후에도 외부변수에 계속 접근이 가능하다

클로저의 장점
일반적인 함수는, 함수 실행이 끝나고 나면 함수 내부의 변수를 사용할 수 없다. 이와 다르게, 클로저는 외부 함수의 실행이 끝나더라도, 외부 함수 내 변수가 메모리 상에 저장된다. (어휘적 환경을 메모리에 저장하기 때문에 가능한 일)

// 외부함수
function outter() {
  var title = 'coding everybody' // 외부함수에 정의되어있는 지역변수
  // 내부함수
  function inner() {
    alert(title); 
    // 내부함수에 title이라는 지역변수가 존재하지 않는다면
    // 바깥쪽의 함수에서 title이라는 변수를 찾고 사용한다
    // 내부함수에서 외부함수의 지역변수에 접근할 수 있다 - 이것을 클로저라고 한다
    }
  inner();
}
outter()
// 외부함수
function outter() {
  var title = 'coding everybody' // 외부함수에 정의되어있는 지역변수
  // 내부함수
  return function inner() {
    alert(title); 
    }
}
var inner = outter();
inner() // 'coding everybody'
// return 이라는 것은 함수가 사용되고 종료되었다는 것인데
// inner함수를 실행했을때 외부함수에 존재하는 값인 title값을 가져 올 수 있다

클로저의 실용적인 예

private variable(비밀변수) : 소프트웨어가 커지는 과정에서 정보를 아무나 수정하지 못하도록 예방하는 것

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')

console.log(ghost.get_title()); // 'Ghost in the shell'
console.log(matrix.get_title()); // 'Matrix'

ghost.set_title('공각기동대') 
// set_title의 값을 공각기동대로 바꿔주게 되면 밑의 사진처럼 값의 변경이 일어난다


console.log(ghost.get_title()); // '공각기동대'
console.log(matrix.get_title()); // 'Matrix'

// 실행된 그 시점에서의 외부함수의 지역변수에 접근가능
// 그 지역변수의 값은 유지가 되고 있기 때문에
// ghost.set_title('공각기동대')을 통해서 공각기동대로 바꾼다는 것은
// ghost객체가 접근할 수 있는 타이틀의 값만 바꾸고
// Matrix객체가 접근 할 수 있는 타이틀의 값은 바꾸지 못한다
    

get_title, set_title 이 내부적으로 사용하고 있는 변수는 title이고
title은 외부함수의 지역변수이다
factory_movie라는 함수가 값을 리턴하고 나면 factory_movie 함수 자체의
삶을 마감했기 때문에 내부함수인 get_title, set_title을 통해서만 title에 접근 할 수 있다
(set_title을 통해서 변수를 수정하고 get_title을 통해서만 변수의 값을 가져 올 수 있다)
title이라는 변수를 아무나 수정할 수 없기 때문에
다른사람이 바깥에서 어떤의미로 사용하든지 간에 안의 맥락에는 영향을 주지 않기 때문에 안전하게 사용 할 수 있다

0개의 댓글