프로그래밍/Javascript

Sam Yoon 2011. 11. 22. 01:13

자바스크립트의 eval과 Function은 동적으로 함수를 만들어 실행할 수 있는 기능을 제공한다.

동적이라는 점에서 유용한 용도로 사용될 수 있지만 그만큼 주의해야 할 사항이 존재한다.


먼저 eval은 문자열을 코드로 인식하여 실행할 수 있도록 해주는 함수인데 실행될 문자열이 어떤 경로로 누구에 의해 만들어질 것인지 알 수 없기 때문에 악의로 조작된 코드가 실행될 가능성이 있어 보안에 문제가 되는 경우가 있다.

그래서 실행될 코드가 반드시 런타임에 결정되어야 하는 상황이 아니라면 가급적 사용하지 않는것이 권장된다.


또한 eval 안에서 선언된 변수는 사용자에게 혼동을 가져다 줄 수 있는데 예컨데

eval("var name = 'sam';); 

위와 같은 구문이 실행되고 나면 name라는 변수는 eval 함수가 실행된 스코프에 변수로 남게된다.

이 코드가 어떤 함수에도 포함되지 않고 실행될 경우 test 변수는 전역변수가 되는 것이다.

(var 없이 선언하면 함수안에 포함되었다 할지라도 전역변수가 된다.)


그리고 eval은 실행되는 문자열의 외부 유효범위에 접근, 수정이 가능한데

var name = 'sam';

eval("name = 'nosam');

이런 코드가 실행될 경우 name의 값이 nosam으로 바뀌게 된다.

이처럼 eval은 의도치 않은 변수 값의 조작이 발생할 수 있기 때문에 사용시 많은 주의가 필요하다.


다음은 Function

eval과 마찬가지로 Function에 전달되는 문자열들은 역시 코드로 인식되어 실행되지만

오로지 전역 스코프에만 접근, 수정이 가능하며 Function 안에서 var로 선언된 변수들은 해당 Function

내에서만 유효하다.


var global = 'global';

(function changeTest() {

    var local = 'local';

    Function("global = 'global2'; local = 'local2'; var madebyfunc = 'madebyfunc'")();

}());


위의 코드에서 Function 생성자의 각 동작을 살펴보면

1. 전역변수인 global에는 접근, 수정이 가능하다.

2. Function 생성자 내부에서 조작이 가해진 local 변수는 chageTest 함수의 local 변수에 수정을 가하는 것이 아니라 local이라는 전역변수를 만든다.

3. Function 생성자 내부에서 만들어진 makebyfunc는 문자열이 코드로 수행된 스코프에서만 유효하다. 즉 외부에서 접근이 불가능하다.


결론: 둘다 동적 함수를 생성하는 기능은 동일하나 Function은 내부에서 var로 생성된 변수가 자동으로 전역변수가 되어버리는

        현상을 만들지 않고, 오로지 전역 스코프만 접근할 수 있기 때문에 eval에 비해 안전하다 할 수 있겠다.

        꼭 동적으로 코드를 수행해야 할 경우 Function 생성자를 사용하는 것이 바람직하겠다.


한 번 정리를 해야 잊지 않을거 같아서 기록해본다.

자바스크립트의 이런저런 특성을 잘 이해하고 사용한다면 틀림없이 강력한 도구가 될 것 같다.

하지만 다른 언어에 비해 복잡한 면모가 있다는 점은 인정..^^ 



위 글을 보면.. eval이 전부 eval!로 표현되고 있다.
강제적인 수행을 막고자 하는것..
eval의 위험성을 알게 몸소 느끼게 해주는 좋은 케이스 ^^

복잡하고 어려운만큼 매력있는 자바스크립트!