티스토리 뷰
발생일: 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()`은 경우에 따라 필요할 때가 있는데, 주의해서 사용해야겠다.
반응형
댓글
공지사항