본문 바로가기
22.12.15 ~ 23.06.08 코드스테이츠

[JavaScript] 클로저

by 디디 ( DD ) 2023. 1. 4.

 

 

 

클로저(Closure) : 함수와 함수가 선언된 어휘적 환경의 조합.

                                어휘적(lexical)? 주변에 있는 글자들 생각하시면 돼요)

 

 

클로저 함수

 

: 함수를 리턴하는 함수. 외부 함수의 변수에 접근할 수 있는 내부 함수.

//클로저 함수의 기본 형태; 함수를 맅컨하는 함수
//const adder = x => y => x + y;

const adder = function(x) {
	return function(y) {
    	return x + y;
    }
}
//외부 함수는 y에 접근 불가, 내부 함수는 x에 접근 가능

 

 

- 데이터를 보존하는 함수로 이용할 수 있다. 

  → 외부 함수(adder)의 실행이 끝나더라도, 외부 함수 내 변수(x)를 사용할 수 있다.

//이런 식으로 사용할 수 있음.
//특정 데이터를 스코프 안에 가두어 둔 채로 계속 사용하기

const tagMaker = tag => content => `<${tag}>${content}</${tag}>`

const divMaker = tagMaker('div');
divMaker('Hello World')  //'<div>Hello World</div>'

 

 

- 정보의 접근을 제한할 수 있다. (캡슐화)

//클로저 모듈 패턴
//모듈화? 함수 재사용성을 극대화하여 함수 하나를 완전히 독립적인 부품 형태로 분리하는 것.

const makeCounter = () => {
	let value = 0;
    
    return {          //객체에 담아 여러 개의 내부 함수를 리턴
    	increase: () => {
        	value = value + 1
        },
        decrease: () => {
        	value = value - 1
        },
        getValue: () => value
    }
}

const counter1 = makeCounter();
counter1.increase();
counter1.increase();
counter1.decrease();
counter1.decrease();
counter1.increase();
counter1.getValue(); // 1

 

 

 


 

종합 퀴즈 문제 풀이

 

let x = 30;

function get () { return x; }
function set (value) { x = value; }

set(10);
let result = get(20);

//result? 10
//set함수는 매개변수 value를 통해 전달받은 값을 전역 변수 x에 할당한다.
//즉, set(10)이 실행되면 전역의 x에 할당된 값이 30에서 10으로 변경됨.

 

 

 

let x = 10;

function outer () {
  let x = 20;

  function inner () {
    x = x + 10;
    return x;
  }
  inner();
}

outer();
let result = x;

//result? 10
//변수 result에 할당된 값은 전역 스코프의 x이므로, 
//outer함수가 호출되어도 아무런 영향을 받지 않는다.

 

let x = 10;

function outer () {
  x = 20;               // <= 위 예시와 다른 부분

  function inner () {
    let x
    x = x + 20;
    return x;
  }
  inner();
}

outer();
let result = x;

//result? 20
//outer 함수가 전역 변수 x에 20을 재할당한다.
//outer 내부에서 inner 함수가 호출되고 있긴 하지만, 
//inner 함수는 바깥 스코프에 아무런 영향을 미치지 않는다.

 

let x = 10;

function outer () {
  x = 20;
  function inner () {
    x = x + 20;          / <= 위 예시와 다른 부분
  }
  inner();
}

outer();
let result = x;

//result? 40
//outer, inner 함수 모두 전역에 선언된 x값을 변경하는 함수임.

 

 

 

var a = 0;
function foo() {
    var b = 0;
    return function() {
        console.log(++a, ++b);
    };
}

var f1 = foo();
var f2 = foo();

f1(); // 1 1
f1(); // 2 2
f2(); // 3 1
f2(); // 4 2

//변수 a 는 글로벌 변수, 변수 b 는 로컬 변수.
//변수 b 는 함수 안에 선언되어 있기 때문에 f1()을 실행할 때, f2()를 실행할 때 각각 카운트가 올라가는 것이고,
//변수 a 는 함수 밖에 선언되어 있기 때문에 f1(), f2() 중 어떤 것을 실행해도 카운트가 올라간다.

 

 

 

 

 

'22.12.15 ~ 23.06.08 코드스테이츠' 카테고리의 다른 글

JavaScript Koans  (0) 2023.01.04
[JavaScript] ES6 주요 문법  (0) 2023.01.04
[JavaScript] 스코프  (0) 2023.01.03
[JavaScript] 원시 자료형 / 참조 자료형  (0) 2023.01.02
나만의 계산기 만들기  (0) 2023.01.01

댓글