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) 문제
실제 서비스 배포 전, 코드를 줄여주는 압축기는 지역 변수 이름을 userName → a 처럼 짧게 바꿉니다.
- 일반 함수는 소스 코드 자체가 같이 바뀌므로 문제가 없습니다.
- 반면,
new Function내부에 작성된 문자열'alert(userName)'은 압축기가 분석할 수 없습니다. 따라서 실행 시점에 바뀌어버린 이름(a)을 찾지 못하고 에러가 발생하게 됩니다.
② 아키텍처의 견고함
함수 내부에서 외부 변수에 의존하는 것은 유지보수 관점에서 위험합니다. new Function은 강제로 외부 변수 접근을 차단함으로써, 필요한 데이터는 반드시 인수로 넘겨받도록 유도합니다.
💡 핵심 팁
new Function으로 만든 함수에 데이터를 전달하고 싶다면 외부 변수를 쓰지 말고, **매개변수(인수)**를 활용하세요!
🎙️ 기술 면접 대비 (Interview Questions)
Q1. new Function의 [[Environment]] 프로퍼티는 무엇을 참조하나요? (중급)
답변: 일반적인 함수는 자신이 생성된 렉시컬 환경을 참조하지만,
new Function으로 생성된 함수의[[Environment]]는 항상 전역 렉시컬 환경을 참조합니다. 이로 인해 지역 변수에는 접근할 수 없고 전역 변수에만 접근이 가능합니다.
Q2. 어떤 상황에서 new Function을 사용하면 좋을까요? (심화)
답변: 주로 런타임에 서버로부터 전달받은 문자열 형태의 코드를 실행 가능한 함수로 변환해야 할 때 사용합니다. 예를 들어 사용자 정의 수식을 계산하는 템플릿 엔진이나, 동적으로 비즈니스 로직을 구성해야 하는 복잡한 웹 애플리케이션에서 대안 없는 해결책이 될 수 있습니다.