내장 함수 eval을 사용하면 문자열을 그대로 코드로서 실행을 시켜준다.
let result = eval(code);
eval은 인자로 받은 값의 실행 결과를 반환한다.
let value = eval('1+1');
alert(value); // 2
let value = eval('let i = 0; ++i');
alert(value); // 1
eval로 둘러싼 코드는 현재 렉시컬 환경에서 실행되므로 외부 변수에 접근 가능하다.
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
엄격 모드에서 eval은 자체 렉시컬 환경을 가지게 된다. eval 내부에 있는 함수와 변수에는 외부에서 접근이 불가능하다.
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (없는 변수)
// 함수 f도 읽을 수 없음
eval은 모던 프로그래밍에서 잘 사용되지 않습니다. "eval is evil(악마)"이라고까지 불리죠.
과거엔 자바스크립트에서 쓸 수 있는 기능이 많지 않았기 때문에 eval을 사용해야만 처리할 수 있는 것들이 많았지만 지금은 eval을 사용할 이유가 거의 없다. (사용하는 것 자체가 보안적으로 엄청난 이슈)
애플리케이션이 출시 되기 전에 자바스크립트 파일을 압축해주는 도구인 코드 압축기(minifier)는 스크립트 크기를 줄이기 위해 지역 변수명을 a나 b같이 짧게 변경합니다. 대개는 이 과정에서 부작용이 발생하지 않지만, eval을 사용하면 eval로 감싼 코드에서 지역 변수에 접근할 수 있으므로 안전하지 않습니다. (string으로 함수를 만드는 Funtion도 동일한 이슈가 존재한다. )
코드 유지 보수를 더 어렵게 만들기 때문에 좋지 않은 프로그래밍 관습이기도 하다.
커링 (Currying) 은 함수의 특징을 사용한 고급기술이다.