eval()
함수는 전달된 문자열을 JavaScript 코드로 해석하여 해석된 코드를 실행한다. 만약 해석하지 못하면 SyntaxError가 발생한다.
eval("console.log('hello world')") //hello world 출력
eval()
함수는 JavaScript의 전역 객체
이며, 해석된 코드에서 마지막 표현식 또는 구문 값을 반환한다. 이때 값이 존재하지 않으면 undefined
를 반환한다.
전역객체 란?
javascript 가장 상위에 있는 객체로, 모든 객체와 함수는 이 전역 객체의 프로퍼티나 메서드로 접근할 수 있다.
일반적으로 사용되는 전역 변수, 전역 함수 그리고 javascript 에서 기본적으로 제공되는 내장 객체들도 전역 객체의 프로퍼티로 존재한다. 예를 들어 Math, Array, Date 와 같은 객체 들이 이에 해단한다.
따라서 eval() 함수도 전역 객체의 메서드로 존재하기 때문에 어디서든 eval() 함수를 호출할 수 있다.
eval을 사용해 콘솔을 출력하는 코드
eval("console.log('ㄹㅇㅋㅋ')") //ㄹㅇㅋㅋ
여러줄의 자바스크립트 코드를 실행
eval("var a = 1; a = a + 10; console.log(a)"); //11
function test(x){
eval("var y = x;");
return y;
}
test("hello"). //hello
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('var str = "hello world"')
console.log(str) // hello world 출력
적용후
'use strict' //엄격모드 적용
eval('var str = "hello world"')
console.log(str) //error
엄격모드를 사용하게 되면 eval 안에서 선언한 변수 str은 전역범위에서 사용할 수 없으며 함수 내부에서만 사용할 수 있다.
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가 반환된다.