IT모저모

[JavaScript] eval 이란 함수 본문

Develop/SpringBoot

[JavaScript] eval 이란 함수

YU JIN 2023. 5. 2. 16:32
반응형

안녕하시렵니까?

오늘은 eval 함수에 대해 알아보겠습니다.

 

 

정의

문자로 표현된 JavaScript 코드를 실행하는 함수 입니다.

eval(String)

매개변수는 string이고 return값은 얻은 값 그대로, 없다면 undefined를 반환합니다.

 

console.log(eval('2 + 2'));
// Expected output: 4

console.log(eval(new String('2 + 2')));
// Expected output: 2 + 2

console.log(eval('2 + 2') === eval('4'));
// Expected output: true

console.log(eval('2 + 2') === eval(new String('2 + 2')));
// Expected output: false

설명

eval()은 global한 함수 속성이고 인자는 문자열입니다.

하지만 연산을 하기위해서는 eval()을 호출하지 않아도 됩니다. 자바스크립트가 알아서 연산을 해주기 때문입죠?

 

하지만 이는 절대 사용하지 말 것!

val()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수입니다.

악의적인 영향을 받았을 수 있는 문자열을 eval()로 실행한다면,

당신의 웹페이지나 확장 프로그램의 권한으로 사용자의 기기에서 악의적인 코드를 수행하는 결과를 초래할 수 있습니다. 또한, 제3자 코드가 eval()이 호출된 위치의 스코프를 볼 수 있으며, 이를 이용해 비슷한 함수인 Function으로는 실현할 수 없는 공격이 가능합니다.

또한 최신 JS 엔진에서 여러 코드 구조를 최적화하는 것과 달리 eval()은 JS 인터프리터를 사용해야 하기 때문에 다른 대안들보다 느립니다.

추가로, 최신 JavaScript 인터프리터는 자바스크립트를 기계 코드로 변환합니다. 즉, 변수명의 개념이 완전히 없어집니다. 그러나 eval을 사용하면 브라우저는 기계 코드에 해당 변수가 있는지 확인하고 값을 대입하기 위해 길고 무거운 변수명 검색을 수행해야 합니다. 또한 eval()을 통해 자료형 변경 등 변수에 변화가 일어날 수 있으며, 브라우저는 이에 대응하기 위해 기계 코드를 재작성해야 합니다. 그러나, (다행히) window.Function이라는 eval보다 훨씬 나은 대안이 있습니다. eval()을 사용하는 코드를 Function()으로 바꾸는 방법에 대해서는 아래를 참조하세요.

 

 

참조: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval

Comments