일급함수란 앞에서 설명했듯이, 어떤 함수가 리턴값으로도 올 수 있고, 다른함수의 인자로 넘겨질 수도 있는 성질을 말한다.


그럼 함수 몸체 내에 있는 free variable의 바인딩을 결정하는 시점은 언제일까?

함수 선언 때? 실행 때?


다음 예를 보자.


var x = 10;
 
(function (funArg) {
 
  var x = 20;
  funArg(); // 10, not 20
 
})(function () { // create and pass a funarg
  console.log(x);
});


익명의 함수를 funArg 라는 이름의 인자로 넘겨주어 호출되도록 하였다.
funArg() 몸체 내에서 x 값을 출력하는데, 이 값은 20(실행시점)이 아니라 10(선언시점) 으로 결정된다.

즉, 자바스크립트에서 함수의 environment를 결정하는 시점은 함수 선언 때 이다.


함수형 언어는 다음의 개념을 가진다.

일급 함수 (first-class function)
함수가 동적으로 리터럴하게 생성되고, argument 또는 다른 함수의 리턴 값으로 사용될 수 있다.


자유 변수 (Free variable)

어떤 함수내에서 사용되는 변수들 중, 그 함수의 로컬변수가 아닌 변수를 말한다.


// Global environment (GE)
 
var x = 10;
 
function foo(y) {
 
  // environment of "foo" function (E1)
 
  var z = 30;
 
  function bar(q) {
    // environment of "bar" function (E2)
    return x + y + z + q;
  }
 
  // return "bar" to the outside
  return bar;
 
}
 
var bar = foo(20);
 
bar(40); // 100


foo는 자유 변수를 가지고 있지 않지만 일급함수 bar가 자유변수 x를 갖는다. 따라서 x를 가지는 parent (전역 유효범위)의 environment를 저장해야 한다.



함수형 언어(JavaScript)는 C언어의 스택매커니즘을 따르면 안된다.

위의 예제와 같이 이너 함수를 리턴으로 넘겨 나중에 bar(40); 으로 호출해 줄 수 있는데, 

foo()의 호출이 끝났다고 foo의 environment(로컬변수)를 날려버리면 bar를 호출했을 때 y, z(자유변수)의 값을 알수 없기 때문이다!!!



따라서 함수형 언어는 스택 매커니즘이 아닌 또 다른 매커니즘으로 변수를 다뤄줘야 한다.






+ Recent posts