Eval: 문자열 코드 실행하기

내장 함수 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은 모던 프로그래밍에서 잘 사용되지 않습니다. "eval is evil(악마)"이라고까지 불리죠.

과거엔 자바스크립트에서 쓸 수 있는 기능이 많지 않았기 때문에 eval을 사용해야만 처리할 수 있는 것들이 많았지만 지금은 eval을 사용할 이유가 거의 없다. (사용하는 것 자체가 보안적으로 엄청난 이슈)

애플리케이션이 출시 되기 전에 자바스크립트 파일을 압축해주는 도구인 코드 압축기(minifier)는 스크립트 크기를 줄이기 위해 지역 변수명을 a나 b같이 짧게 변경합니다. 대개는 이 과정에서 부작용이 발생하지 않지만, eval을 사용하면 eval로 감싼 코드에서 지역 변수에 접근할 수 있으므로 안전하지 않습니다. (string으로 함수를 만드는 Funtion도 동일한 이슈가 존재한다. )

코드 유지 보수를 더 어렵게 만들기 때문에 좋지 않은 프로그래밍 관습이기도 하다.


커링

커링 (Currying) 은 함수의 특징을 사용한 고급기술이다.