[JavaScript] eval() 이란?

김범식·2023년 6월 27일
0



eval 함수란?


eval()함수는 전달된 문자열을 JavaScript 코드로 해석하여 해석된 코드를 실행한다. 만약 해석하지 못하면 SyntaxError가 발생한다.

eval("console.log('hello world')") //hello world 출력



eval() 함수는 JavaScript의 전역 객체이며, 해석된 코드에서 마지막 표현식 또는 구문 값을 반환한다. 이때 값이 존재하지 않으면 undefined를 반환한다.



전역객체 란?
javascript 가장 상위에 있는 객체로, 모든 객체와 함수는 이 전역 객체의 프로퍼티나 메서드로 접근할 수 있다.
일반적으로 사용되는 전역 변수, 전역 함수 그리고 javascript 에서 기본적으로 제공되는 내장 객체들도 전역 객체의 프로퍼티로 존재한다. 예를 들어 Math, Array, Date 와 같은 객체 들이 이에 해단한다.
따라서 eval() 함수도 전역 객체의 메서드로 존재하기 때문에 어디서든 eval() 함수를 호출할 수 있다.



📎  eval() 함수 사용방법


eval을 사용해 콘솔을 출력하는 코드

eval("console.log('ㄹㅇㅋㅋ')")  //ㄹㅇㅋㅋ 



여러줄의 자바스크립트 코드를 실행

eval("var a = 1; a = a + 10; console.log(a)"); //11



📎  지역 스코프에서 eval() 함수


function test(x){
	eval("var y = x;");
	return y;
}
test("hello").  //hello

eval() 함수는 앞서 말했듯 전역 객체의 함수이다. 때문에 로컬 스코프에서 사용할 수 있다.



📎  eval() 간접 호출하기


var a = "global";

function print() { 
    var b = "local"; 
    var func = eval;
    func('var result = a')
    console.log(result);    // global 출력됨
    func('var result = b')
    console.log(result);    // error 발생
}

print();

console.log(result); //global 출력



eval은 전역 변수 스코프이기 때문에 함수스코프에 존재하는 지역변수 b 는 사용할 수 없다.

재밌는점은 eval()은 전역 함수 이기때문에 안에서 정의한 변수를 전역변수로 사용할 수 있다. 때문에 다음과 같이 result를 함수밖에서 사용해도 되는것이다.



📎  eval() 엄격모드(use strict)


적용하기 전

eval('var str = "hello world"')
console.log(str) // hello world 출력



적용후

'use strict' //엄격모드 적용

eval('var str = "hello world"')
console.log(str) //error



엄격모드를 사용하게 되면 eval 안에서 선언한 변수 str은 전역범위에서 사용할 수 없으며 함수 내부에서만 사용할 수 있다.



📎  eval() 함수 반환


eval("function func() {console.log('Hello World')}");
func(); //Hello World

eval 함수가 func() 함수를정의 하면서 전역 객체에 추가 된다.



eval("(function func() {console.log('Hello World')})()") //Hellow World

즉시표현식도 사용할 수 있고



eval("var g = function func() {console.log('Hello World')};g();"); //Hellow World

변수에 할당해서 사용할 수도 있다.



() 를 사용하면 eval함수의 반환값을 사용할 수 있다.

var evalFunc = eval("(function print() {console.log('Hello World')})");
evalFunc(); //Hellow world 출력

다음과 같이 함수를 선언하면 반환하여 사용할 수 있다. 여기서 evalFunc는 함수스코프에 영향을 받기 때문에 지역적으로 선언된것이라고 할 수 있다.



만약 () 반환식을 사용하지 않는다면

var evalFunc = eval("function print() {console.log('Hello World')}");
evalFunc(); //undefined

undefined가 반환된다.

profile
frontend developer

0개의 댓글