logo

DowanKim

44. new Function

2026년 4월 15일

자바스크립트

기존의 함수 선언문이나 함수 표현식은 개발자가 코드를 작성하는 시점에 모든 로직이 결정됩니다. 하지만 **new Function**은 매우 독특합니다. 바로 런타임(실행 중)에 문자열을 전달받아 함수를 생성할 수 있기 때문이죠.


🏗️ 1. new Function의 기본 문법

new Function은 인자와 함수 본문을 모두 문자열로 받습니다.

기본 구조

let func = new Function([arg1, arg2, ...argN], functionBody);

다양한 인수 전달 방식

함수의 인수를 정의할 때는 아래와 같이 여러 가지 방식을 사용할 수 있으며, 모두 동일하게 동작합니다.

  • 기본 방식: new Function('a', 'b', 'return a + b');
  • 쉼표 구분: new Function('a,b', 'return a + b');
  • 공백 포함: new Function('a , b', 'return a + b');

💻 2. 예시로 보는 활용법

① 기본 연산 함수 (인수 있음)

let sum = new Function('a', 'b', 'return a + b'); alert( sum(1, 2) ); // 3`

② 단순 실행 함수 (인수 없음)

let sayHi = new Function('alert("Hello")'); sayHi(); // Hello

③ 동적 함수 생성 (가장 강력한 특징)

서버에서 어떤 수식을 문자열 형태로 보내준다면, 이를 즉시 함수로 바꿀 수 있습니다.

let strFromServer = 'alert("서버에서 온 메시지입니다!")'; let func = new Function(strFromServer); func(); // 서버에서 온 메시지입니다!

🧠 3. 클로저의 예외: 전역 렉시컬 환경 참조

이 부분이 new Function의 가장 중요한 특징이자 주의점입니다. 일반적인 함수는 자신이 태어난 곳의 외부 변수를 기억하지만, new Function으로 만든 함수는 오직 전역 변수에만 접근할 수 있습니다.

일반 함수 vs new Function 비교

[일반 함수 표현식: 클로저 동작]

function getFunc() { let value = "test"; let func = function() { alert(value); }; return func; } getFunc()(); // "test" 출력 (부모 함수의 변수에 접근 가능)

[new Function: 전역만 바라봄]

function getFunc() { let value = "test"; let func = new Function('alert(value)'); // ReferenceError 발생! return func; } getFunc()(); // Error: value is not defined`

🛡️ 4. 왜 이런 특징이 있을까? (압축기와 아키텍처)

① 코드 압축기(Minifier) 문제

실제 서비스 배포 전, 코드를 줄여주는 압축기는 지역 변수 이름을 userNamea 처럼 짧게 바꿉니다.

  • 일반 함수는 소스 코드 자체가 같이 바뀌므로 문제가 없습니다.
  • 반면, new Function 내부에 작성된 문자열 'alert(userName)'은 압축기가 분석할 수 없습니다. 따라서 실행 시점에 바뀌어버린 이름(a)을 찾지 못하고 에러가 발생하게 됩니다.

② 아키텍처의 견고함

함수 내부에서 외부 변수에 의존하는 것은 유지보수 관점에서 위험합니다. new Function은 강제로 외부 변수 접근을 차단함으로써, 필요한 데이터는 반드시 인수로 넘겨받도록 유도합니다.

💡 핵심 팁

new Function으로 만든 함수에 데이터를 전달하고 싶다면 외부 변수를 쓰지 말고, **매개변수(인수)**를 활용하세요!


🎙️ 기술 면접 대비 (Interview Questions)

Q1. new Function[[Environment]] 프로퍼티는 무엇을 참조하나요? (중급)

답변: 일반적인 함수는 자신이 생성된 렉시컬 환경을 참조하지만, new Function으로 생성된 함수의 [[Environment]]는 항상 전역 렉시컬 환경을 참조합니다. 이로 인해 지역 변수에는 접근할 수 없고 전역 변수에만 접근이 가능합니다.

Q2. 어떤 상황에서 new Function을 사용하면 좋을까요? (심화)

답변: 주로 런타임에 서버로부터 전달받은 문자열 형태의 코드를 실행 가능한 함수로 변환해야 할 때 사용합니다. 예를 들어 사용자 정의 수식을 계산하는 템플릿 엔진이나, 동적으로 비즈니스 로직을 구성해야 하는 복잡한 웹 애플리케이션에서 대안 없는 해결책이 될 수 있습니다.