본문 바로가기

JavaScript

Closures 이해하기 (By Checkpoint 2)

● 개념

 

: A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function’s scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.

 

● 문제풀이 목적

 

:  일반 내부함수와 클로저 내부함수를 구분할 줄 안다.

 

 

1번 - 아래 코드에서, 어떤 function 이 closure 로 간주됩니까?

 

var seenYet = function() {
  var archive = {};
  return function(val) {
    if (archive[val]) {
      return true;
    } 
    archive[val] = true;
    return false;
  }
}

// 위의 코드에서 closure 함수는 seenYet이 반환하는 익명함수이다

 

2번 - total 의 값은 무엇인가요?

 

var add = function(x) {
  var sum = function(y) {
  return x + y;
  }
return sum;
}

var foo = add(1);
foo(3);
var total = foo(6);

// var foo는 add(1) => add 함수의 x를 1로 설정
// 선언한 foo에 3을 인자로 넣어 실행 => foo는 1을 x로 가지고 있는 함수이고 이 함수에 인자로 3을 넣었다
// 즉 y로 3을 넣었다. 그럼 결과 값은 4이다. 
// 근데 현재 구하고자 하는 값은 foo(6)이므로 1 + 6을 해서 7이 답이 된다.

 

3번 - 다음 함수(multiplyByX, multiplyByFive)중 closure 사용을 보여주는 함수는 무엇입니까?

 

var multiplyByX = function(x) {
  return function(y) {
    return x * y;
  }
}

var multiplyBy5 = multiplyByX(5);
multiplyBy5(4);

===================================================================

var multiplyByFive = function() {
  return function(y) {
    return 5 * y;
  }
}

var multiplyBy5 = multiplyByFive();
multiplyBy5(4);

// 위의 함수 중 closure인 함수는 첫번째 함수이다
// 두번째 함수는 익명함수가 내부함수를 반환하는데 
// 이 내부함수는 외부함수의 인자나 데이터를 받아서 사용하는 것이 아니고 
// 내부함수 안에서 임의의 숫자를 지정해두고 내부함수의 인자인 y를 곱하는 방식이다
// 이렇다면 그냥 5에 들어온 인자를 곱하는 함수를 하나의 함수로 더 감싸 놓았을 뿐이고, 재사용성도 없다


4번 JavaScript 에서 Closure 를 정의해보세요.

 

외부함수에 접근할 수 있는 내부함수와 이와 같은 작동원리