티스토리 뷰

Daylogs/Javascript

eval in IE8

ohgyun 2014. 11. 29. 16:00
발생일: 2014.11.27

키워드: eval, indirect eval, IE8

문제:
`eval`을 변수에 담아 간접 호출(indirect eval call)하는 경우엔,
eval 안의 문자열이 전역 컨텍스트로 실행된다.

아래 코드를 보면 동작 방식을 이해할 수 있다.

  var foo = {
    bar: function () {
      var indirectEval = eval;
      console.log( eval(‘this’) ); //—> foo 객체 
      console.log( indirectEval(‘this’) ); //—> window
    }
  };

`eval()`의 동작 방식에 대해서는 예전에도 한 번 포스팅한 적이 있다. ('eval의 모든 것’)

헌데, IE8에서는 의도한 대로 동작하지 않는다.
어랏. 이상한데… 왜일까?


해결책:

확인해보니 `eval()`의 간접 콜이 글로벌 스콥으로 실행되는 건 IE9부터라고 한다.

또한, IE8에서는 `eval()`의 실행 결과가 바로 리턴되지 않는다.

실제로 IE8에서 위 코드를 실행하면 아래 결과가 나온다.

  var foo = {
    bar: function () {
      var indirectEval = eval;
      console.log( eval(‘this’) ); //—> undefined
      console.log( indirectEval(‘this’) ); //—> undefined
      eval( ‘console.log(“this”)’ ); //—> window
      indirectEval( ‘console.log(“this”)’ ); //—> window
    }
  }; 


jQuery 코드에 보면 `$.globalEval()`이란 함수가 있는데,
해당 코드에서는 이 문제를 해결하기 위해서 `execScript()`를 사용하고 있다.


`eval()`은 경우에 따라 필요할 때가 있는데, 주의해서 사용해야겠다.


반응형
댓글
공지사항