JavaScript Template 소스 코드를 보다가 함수 생성에 대한 매우 흥미로운 사용법을 발견했습니다. 이것이 바로 메타 프로그래밍이 아닐까요?
자바스크립트 메타프로그래밍
메타프로그래밍은 다른 프로그램(또는 그 자체)을 데이터로 작성 또는 조작하거나 컴파일 타임에 완료되어야 하는 일부 작업을 런타임에 완료하는 특정 유형의 컴퓨터 프로그램을 작성하는 것을 의미합니다.
자바스크립트 평가
eval() 함수는 문자열을 평가하고 그 안에 있는 JavaScript 코드를 실행합니다.
다음과 같이 사용할 수 있습니다:
eval("x=10;y=20;document.write(x*y)")
물론 이것은 특정 기능을 실행하는 데에만 사용되지만 이 제품은 비용 효율적이고 오류가 발생하기 쉽습니다.
eval 함수는 가능하면 피해야 합니다.
따라서 더 좋은 방법은 New Function()을 사용하는 것입니다.
New Function()과 eval()을 사용할 때의 가장 큰 차이점은 eval이 단순한 함수가 아니라는 점입니다.
eval()은 현재 실행 범위 내에서 문자열을 JavaScript 표현식으로 평가하고 지역 변수에 액세스할 수 있습니다. New Function()은 저장된 문자열을 JavaScript 코드에서 호출할 수 있는 함수 개체로 구문 분석합니다. 코드는 별도의 범위에서 실행되므로 지역 변수에 액세스할 수 없습니다.
즉, eval()은 현재 함수의 범위를 방해합니다. .
자바스크립트 새 함수()
Function 생성자는 새로운 Function 객체를 생성합니다. JavaScript에서 각 함수(함수)는 실제로 Function 생성자를 사용하여 생성된 Function 객체가 함수 생성 시 구문 분석됩니다. 함수 명령문을 사용하여 선언된 함수는 다른 명령문과 함께 구문 분석되므로 함수를 선언하고 코드에서 호출하는 것보다 효율성이 떨어집니다.
New Function()은 상대적으로 효율성이 떨어지며 이는 현재 상황에서 예측할 수 있는 것입니다.
간단한 예는 다음과 같습니다.
var add = new Function(['x', 'y'], 'return x y');
new Function()은 문자열을 함수로 구문 분석합니다. . 그런 다음 Apply를 통해 실행하면 됩니다
함수.적용(null, args)
JavaScript 템플릿에는 다음이 표시됩니다.
새로운 기능(
tmpl.arg ',tmpl',
"var _e=tmpl.encode" tmpl.helper ",_s='"
str.replace(tmpl.regexp, tmpl.func)
"';return _s;"
);
물론 다른 방법도 있습니다.