프론트엔드 첫걸음

클로저 본문

개발 공부/Javascript

클로저

차정 2022. 10. 8. 17:15

[생활코딩] https://youtu.be/bNqOHnsJm-w

function outter(){
  var title = 'coding everybody'; 
  function inner(){   
    alert(title);
  }
  inner();
}
outter(); // alert('coding everybody')
  • 내부함수에서 외부함수의 지역변수에 접근할 수 있는 것을 클로저라고 함

 function outter(){
   var title = 'coding everybody';  
   return function(){        
       alert(title);
   }
}
var inner = outter();
inner();  // alert('coding everybody')
  • inner(); 로 outter를 호출하면 function() 리턴
  • 리턴했다는 것은 그 외부함수가 끝났다는건데, 이미 끝난 외부함수에 존재하는 변수 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()); //'Ghost in the shell';
alert(matrix.get_title()); //'Matrix'

ghost.set_title("공각기동대");

alert(ghost.get_title()); //'공각기동대'
alert(matrix.get_title()); //'Matrix'
  • factory_movie라는 함수가 객체를 리턴
  • 객체에 두개의 메소드 get_title, set_title있음(속성이 함수를 값으로 가지면 메소드)
  • title정보에 접근할수 있는건 get_title, set_title이라는 메소드 뿐.
  • title의 값을 읽고 수정 할 수 있는 것은 factory_movie 메소드를 통해서 만들어진 객체 뿐이라는 의미다. JavaScript는 기본적으로 Private한 속성을 지원하지 않는데, 클로저의 이러한 특성을 이용해서 Private한 속성을 사용할 수 있게된다.

 

[코딩앙마 클로저 
https://www.youtube.com/watch?v=tpl2oXQkGZs

 

function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

const add3 = makeAdder(3);
console.log(add3(2)); //5

[익명함수 lexical ] y: 2  -> [내부 lexical 환경] x:3 -> [전역 lexical 환경] makeAdder{} , add3(초기화 x)

add3(2)  실행되 y=2 갖고 상위 lexical의 x = 3 에 접근가능 ~ 5반환 

 

function makeCounter() {
  let num = 0;
  return funtion () {
  	return num++;
  }
}

let counter = makeCounter();
counter(); //0
counter(); //1
counter(); //2
" 함수가 생성될 당시의 외부변수를 기억하고, 생성된 이후에도 계속 접근 가능한 것~
생성당시의 변수를 기억~ 은닉화 가능 !"