toggle menu

[JavaScript] eval 함수

2013. 4. 19. 17:41 JavaScript
eval 함수를 사용하면 String 형태의 JavaScript 소스 코드를 동적으로 실행할 수 있다.

하지만 대부분의 경우 eval 함수를 사용하지 않고서도 충분히 동일한 동작을 구현할 수 있는 경우가 많고 또 보안상 위험한JavaScript 코드를 바로 실행할 수 있다는 위험때문에 eval 함수 사용은 권장되지 않는 분위기다. 자바스크립트 코드 최적화 관련 글에서는 eval 함수 사용 자제가 거의 당골 수준으로 언급되기도 한다. eval을 사용할 경우 eval로 실행할 코드는 자바스크립트 컴파일러가 미리 최적화시킬 수 없기 때문이다.

하지만 프레임워크 구현 등 보다 높은 수준에서 자바스크립트를 사용하는 상황에서는 eval 함수의 적절한 활용이 필수적으로 요구된다.
 
eval 함수의 파라메터로 입력된 String은 JavaScript 파서에 의해 구문 분석되고 실행된다.
eval 함수에 전달된 코드는 eval 함수가 호출되는 것과 같은 상황에서 실행되며, 실행된 코드에 리턴값이 있는 경우 해당 값을 리턴해준다.

JSON 데이터의 경우, JSON.parse 함수를 사용하여 JSON(JavaScript Object Notation) 텍스트를 deserialize 하는 것이 eval 함수보다 안전하고 실행 속도도 빠르다.

var dateFn = "Date(1971,3,8)";
var myDate;
eval("myDate = new " + dateFn + ";");

document.write(myDate);

// Output: Thu Apr 8 00:00:00 PDT 1971

위의 코드는 eval 함수에 대한 간단한 사용 예를 보여주고 있다.

실제 eval 함수 사용시에는 보통 scope까지 고려해서 구현하게 되므로, direct call 과 indirect call 에 대한 개념에 대해서 이해할 필요가 있다. 아래의 참고할만한 사이트의 글을 읽어보면, eval 함수의 direct call과 indirect call에 대해 이해의 폭을 넓힐 수 있다.

참고할만한 사이트
http://ohgyun.com/395 
eval 함수에 대해 예제와 함께 자세한 개념을 설명함.
 
http://perfectionkills.com/global-eval-what-are-the-options/
eval 함수에 대한 매우 자세한 분석
 


eval 함수와 비슷한 기능을 하는 함수로 Function 함수가 있는데, 이에 대한 설명은 아래의 링크를 참고하면 좋을 것 같다.

http://blog.daum.net/sansamgu/33
eval과 Function의 차이점에 대해 설명함. 



 

JavaScript 관련 포스팅 더보기