자바스크립트에서 함수를 정의하는 두 번째 방법인 Function 생성자
는 Function 객체로부터 함수를 생성합니다. 배열편에서 살짝 언급했는데요. 자바스크립트는 배열, 함수, 객체 등을 모두 객체로 취급합니다.
Functon 생성자
를 통한 함수 정의는 다음과 같이 사용합니다.
const 변수명 = new Function(인자, 함수의 본체);
만약 인자가 여러개라면, 인자를 여러개 적고 함수의 본체를 가장 마지막에 적어주기만 하면 됩니다.
const addNumber = new Function('num1', 'num2', 'return num1+num2');
console.log("결과: " + addNumber(1, 2));
또한 함수의 본체가 여러 줄로 구성되어있다면 각 문장은 세미콜론으로 구분해 여러 줄의 함수 본체를 구성할 수 있습니다.
let addNumber = new Function('num1, num2', 'console.log("더하기"); return num1+num2');
console.log("결과: " + addNumber(1, 2));
이전에 배운 function 명령
을 이용한 함수 정의 방식보다 많이 복잡하지 않나요? 실제로도 복잡합니다. 그렇다면 이렇게 복잡한 방법이 존재하고, 알아둬야하는지 알아보겠습니다.
혹시 방금 Function 생성자
로 정의하는 것을 배우면서 특별한 점을 눈치채셨나요? 바로 인수와 함수 본체를 문자열로 정의한다는 점이었는데요. 이 특징을 생각해보면 다음과 같이 문자열형 변수를 통한 간결한 선언이 가능합니다.
let param = 'num1, num2';
let getResult = 'return num1 + num2;';
const addNumber = new Function(param, getResult);
console.log("합계: " + addNumber(1, 2));
방금 본 것 처럼 문자열을 이용해서 동적인 함수 생성이 가능합니다. 하지만 동적 함수 생성이라는 강력한 장점에도 불구하고 Function 생성자
를 사용하는 것은 지양해야합니다. 왜냐하면, 문자열 삽입 공격에 노출될 경우 인자, 함수 본체를 조작할 수 있기 때문에 보안면에서 굉장히 취약한 방식입니다.
그래서 함수를 선언할 때 Function 생성자
방식 대신에 function 명령
, 다음에 나올 함수 리터럴
방식을 우선적으로 이용하는 것이 권장됩니다.