[Javascript] 사용자 정의 함수 2 - Function 생성자

Bam·2022년 2월 24일
0

Javascript

목록 보기
33/106
post-thumbnail

Function 생성자

자바스크립트에서 함수를 정의하는 두 번째 방법인 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 명령을 이용한 함수 정의 방식보다 많이 복잡하지 않나요? 실제로도 복잡합니다. 그렇다면 이렇게 복잡한 방법이 존재하고, 알아둬야하는지 알아보겠습니다.

혹시 방금 Function 생성자로 정의하는 것을 배우면서 특별한 점을 눈치채셨나요? 바로 인수와 함수 본체를 문자열로 정의한다는 점이었는데요. 이 특징을 생각해보면 다음과 같이 문자열형 변수를 통한 간결한 선언이 가능합니다.

let param = 'num1, num2';
let getResult = 'return num1 + num2;';

const addNumber = new Function(param, getResult);

console.log("합계: " + addNumber(1, 2));


Function 생성자 방식을 지양해야하는 이유

방금 본 것 처럼 문자열을 이용해서 동적인 함수 생성이 가능합니다. 하지만 동적 함수 생성이라는 강력한 장점에도 불구하고 Function 생성자를 사용하는 것은 지양해야합니다. 왜냐하면, 문자열 삽입 공격에 노출될 경우 인자, 함수 본체를 조작할 수 있기 때문에 보안면에서 굉장히 취약한 방식입니다.

그래서 함수를 선언할 때 Function 생성자 방식 대신에 function 명령, 다음에 나올 함수 리터럴 방식을 우선적으로 이용하는 것이 권장됩니다.

0개의 댓글