[Effective JavaScript] 직접적인 eval 보다 간접적인 eval을 사용하자

김범식·2023년 6월 27일
0

Effective JavaScript

목록 보기
9/33



📌  [tip]

var a = 'hello World'
var b = eval("a");
console.log(b)  //hello World

eval() 함수 안에 변수를 넣으면 변수 안의 값을 반환한다.



var c = eval(" 'hello World' ")
console.log(c) //'hello World'

문자열을 넣어도 그대로 반환한다.



eval함수는 단순한 함수가 아니다. 대부분의 함수에는 자신이 선언된 스코프에 점근할 수 있고, 그 이외에는 접근할 수 없지만 eval은 자신이 호출된 시점의 전체 스코프에 접근할 수 있다. 모든 함수 호출이 런타임시 eval로 호출되었다고 판명되는 경우, 자신의 스코프를 사용 가능하도록 만들어 줘야 하기 때문이다.

var x = "global"
function test(){
	var x= 'local'
	return eval('x'); //직접적인 eval
}

test(); //local

이 경우 컴파일러는 반드시, 실행된 프로그램이 호출자의 지역 스코프에서 접근을 끝마치게 해야한다. 다른방법으로는 간접적인 호출로 eval을 사용하면 된다.



var x = "global"
function test(){
	var x= 'local'
	var f = eval;
	return f('x'); //간접적인 eval
}

test(); //global

이렇게 대체된 이름을 통해 호출하면 코드는 지역 스코프로의 모든 접근을 잃게 된다. 때문에 x는 local이 아닌 global이 된다.



간접적인 eval의 호출은 다음과 같이 표현되곤 한다.

(0,eval)(src)

숫자 리터럴 0은 평가되지만 그값은 무시하고 괄호 로 감싸진 연속 표현식은 eval함수를 만들어 낸다. 따라서 (0,eval)은 일반적인 eval식별자와 거의 완전히 똑같이 동작한다. 간접적으로 호출되는 형태라는 점만 빼고 말이다.



기억할 점

  • eval을 무의미한 리터럴과 함께 연속 표현식으로 감싸서 간접적인 eval로 사용되도록 강제하라
  • 언제든지 가능하다면 직접적인 eval보다는 간접적인 eval을 사용하라
profile
frontend developer

0개의 댓글