IT_Programming/JavaScript

자바스크립트 완벽가이드 - 8.9 Function() 생성자

JJun ™ 2010. 7. 4. 22:42


앞에서 설명한 바와 같이 함수는 일반적으로 함수 정의 문장이나 함수 리터럴 표현식의 function 키워드를

사용하여 정의된다. 또한 함수는 Function() 생성자를 사용해서도 정의될 수 있다.

 

Function() 생성자를 사용하는 것은 보통 함수 리터럴을 사용하는 것보다 난해하기 때문에 이러한 테크닉은 그리 널리 쓰이지는 않는다. 다음 예는 Function() 생성자를 사용하여 함수를 생성하는 예를 보여 준다.

var f = new Function("x", "y", "return x*y");

이 코드가 생성하는 새로운 함수는 아래처럼 친숙한 문법으로 정의된 함수와 완전히 동일하다.
function f(x,y) { return x*y; }


Function() 생성자는 임의 개수의 문자열 전달인자를 건넵다는다. 마지막 문자열 전달인자는 함수의 몸체이며 이것은 세미콜론으로 분리된 임의 개수의 자바스크립트 문장들로 이루어진다.

 

생성자의 다른 전달인자들은 정의할 함수의 매개변수 이름을 지정하는 문자열들이다.

만약 전달인자를 하나도 받지 않는 함수를 정의한다면 그냥 함수의 몸체를 지정하는 문자열 하나만

생성자에 전달해주면 된다.


Function() 생성자가 생성할 함수의 이름을 지정하기 위한 전달인자를 오구하지 않음을 유의하라.

함수 리터럴과 마찬가지로 Function() 생성자도 이름이 없는 익명 함수를 생성한다.
Function() 생성자를 이해하기 위해서 중요한 점들이 몇 가지 있다.

  • Function() 생정자를 사용하면 실행시점에 자바스크립트 코드를 동적으로 생성하고 컴파일할 수 있다. 이러한 점에서 Function() 생성자는 전역 함수인 eval() 함수(3부를 참고하라)와 유사하다.
  • Function() 생성자는 호출될 때마다 함수 몸체를 파싱하고 새로운 함수 객체를 생성한다. 따라서 만약 생성자 호출이 루프 안이나 자주 호출되는 함수 안에서 이루어진다면, 이러한 작업은 비효율적일 수 있다. 반면에 루프와 함수안의 함수 리터럴이나 중첩된 함수는 그것이 나타날 때마다 매번 다시 컴파일 되지 않는다. 또한 함수 리터럴이 나타날 때마다 생성되는 함수는 서로 다른 함수 객체가 생성된 것이 아니다. (하지만 앞에서 알아본 바와 같이, 함수가 정의된 어휘적 유효 범위의 다른 점을 포작하기 위해선 새로운 클로저가 필요하다.)
  • 끈으로 Function() 생성자의 가장 중요한 점은 생성된 함수가 어휘적 유효 범위를 사용하지 않는다는 것이다. 대신에 Function() 생성자에 의해 생성된 함수는 다음 코드에서 확인할 수 있듯이 마치 최상위 레벨의 함수인 것처럼 컴파일 된다.
    var y = "global";
    function constructFunction() {
    var y = "local";
    return new Function("return y");  // 이 함수는 지역 유효 범위를 포착하지 않는다.
    }
    // 이 코드는 "global"을 출력한다. 이는 Function() 생성자에 의해 변환된 함수가
    // 지역 유효 범위를 사용하지 않기 때문이다.
    // 만약 함수 리터럴을 대신 사용했다면 다음의 코드는 "local"을 출력할 것이다.
    alert(constructFunction()());  // "global"을 출력한다.