Javascript - New Function

New Function 문법

함수를 만드는 방법은 함수 표현시과 함수 선언문이 있는데, 그 외에도 New Function 문법을 사용하여 함수를 만들 수가 있다.

// 인수가 있는 함수
let sum = new Function('a', 'b', 'return a + b');

alert( sum(1, 2) ); // 3

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

// 인수가 없는 함수
sayHi(); // Hello

new Function 문법을 사용하여 함수를 만들면, 런타임시에 받은 문자열을 사용하여 함수를 만들 수 있다는 것이다. 함수 표현식과 함수 선언문은 개발자가 직접 스크립트를 짜야만 만들 수 있다는 차이점이 있다.

그래서 위 문법은 서버에서 값을 받아 함수를 동적으로 만들어 동작시켜야할 때 사용할 수 있다.

함수는 [[Environment]]에 저장된 정보를 이용하여 함수 자신이 만들어진 곳을 기억하게 되는데, new Function 문법을 사용하여 만들어진 함수의 [[Environment]]는 현재 렉시컬 환경을 참조하지않고, 전역 렉시컬 환경을 참조하게 된다.

그래서 new Function 문법을 사용한 함수는 외부 변수에 접근할 수 없고, 전역 변수에만 접근이 가능하다.

function getFunc() {
  let value = "test";

  let func = new Function('alert(value)');

  return func;
}

getFunc()(); // ReferenceError: value is not defined

function getFunc() {
  let value = "test";

  let func = function() { alert(value); };

  return func;
}

getFunc()(); // getFunc의 렉시컬 환경에 있는 값 "test"가 출력됩니다.

Reference