eval()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itโs been available across browsers since โจ2015๋ 7์โฉ.
๊ฒฝ๊ณ :
์ฃผ์: ๋ฌธ์์ด๋ก๋ถํฐ eval() ์ ์คํํ๋ ๊ฒ์ ์์ฒญ๋๊ฒ ์ํํฉ๋๋ค. eval() ์ ์ฌ์ฉํ๋ฉด ํด์ปค๊ฐ ์ํํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋์ eval์ ์ ๋ ์ฌ์ฉํ์ง ๋ง ๊ฒ!์ ํ์ธํ์ธ์.
eval() ์ ๋ฌธ์๋ก ํํ๋ JavaScript ์ฝ๋๋ฅผ ์คํํ๋ ํจ์์
๋๋ค.
์๋ํด ๋ณด๊ธฐ
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(string);
๋งค๊ฐ๋ณ์
string-
JavaScript ํํ์, ๋ช ๋ น๋ฌธ, ๋๋ ์ฐ์๋๋ ๋ค์์ ๋ช ๋ น๋ฌธ์ ๋ํ๋ด๋ ๋ฌธ์์ด. ํํ์์ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด์ ๋ณ์๋ ์์ฑ์ ํฌํจํ ์ ์์ต๋๋ค.
๋ฐํ๊ฐ
์ฃผ์ด์ง ์ฝ๋๋ฅผ ํ๊ฐํ์ฌ ์ป์ ๊ฐ. ๊ฐ์ด ์๋ค๋ฉด undefined๋ฅผ ๋ฐํํฉ๋๋ค.
์ค๋ช
eval()์ ์ ์ญ ๊ฐ์ฒด์ ํจ์ ์์ฑ์
๋๋ค.
eval()์ ์ธ์๋ ๋ฌธ์์ด์
๋๋ค. ์ธ์๊ฐ ํํ์์ ๋ํ๋ธ๋ค๋ฉด eval()์ ํํ์์ ํ๊ฐํฉ๋๋ค. ์ธ์๊ฐ ํ๋ ์ด์์ JavaScript ๋ช
๋ น๋ฌธ์ ๋ํ๋ธ๋ค๋ฉด ๋ชจ๋ ์คํํฉ๋๋ค. ์ฐ์ฐ์์ ๊ณ์ฐํ๊ธฐ ์ํด eval()์ ํธ์ถํ์ง ๋ง์ธ์. JavaScript๋ ์ฐ์ฐ์์ ์์์ ๊ณ์ฐํฉ๋๋ค.
๋ฌธ์์ด๋ก ์ฐ์ฐ์์ ๊ตฌ์ฑํ๋ฉด ๋์ค์ eval()๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค. x ๋ผ๋ ๋ณ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด x๊ฐ ํฌํจ๋ ์ฐ์ฐ์์ ๋ฌธ์์ด๋ก, ์๋ฅผ ๋ค์ด "3 * x + 2"๋ก ๋ํ๋ด๊ณ ๋์ค์ eval()์ ํธ์ถํด์ ๊ณ์ฐ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
eval()์ ์ธ์๊ฐ ๋ฌธ์์ด์ด ์๋๋ฉด eval()์ ์ธ์๋ฅผ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค. ๋ค์ ์์์์, String ์์ฑ์๊ฐ ๋ช
์๋ ๊ฒฝ์ฐ ๋ฌธ์์ด์ ๊ณ์ฐํ๋ ๋์ String ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
eval(new String("2 + 2")); // "2 + 2"๋ฅผ ํฌํจํ String ๊ฐ์ฒด๋ฅผ ๋ฐํ
eval("2 + 2"); // 4๋ฅผ ๋ฐํ
toString()์ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ์ฝ์ ํผํ ์ ์์ต๋๋ค.
var expression = new String("2 + 2");
eval(expression.toString()); // 4๋ฅผ ๋ฐํ
eval์ ์ง์ ํธ์ถํ์ง ์๊ณ ์ฐธ์กฐ๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ECMAScript 5๋ถํฐ๋ ์ง์ญ ๋ฒ์๊ฐ ์๋๋ผ ์ ์ญ ๋ฒ์์์ ๋์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด eval()๋ก ํจ์๋ฅผ ์ ์ธํ๋ฉด ์ ์ญ ํจ์๊ฐ ๋๊ณ , ์คํ๋๋ ์ฝ๋๋ ์คํ๋๋ ์์น์ ์ง์ญ ๋ฒ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
function test() {
var x = 2,
y = 4;
console.log(eval("x + y")); // ์ง์ ํธ์ถ, ์ง์ญ ๋ฒ์ ์ฌ์ฉ, ๊ฒฐ๊ณผ๊ฐ์ 6
var geval = eval; // eval์ ์ ์ญ ๋ฒ์๋ก ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ์
console.log(geval("x + y")); // ๊ฐ์ ํธ์ถ, ์ ์ญ ๋ฒ์ ์ฌ์ฉ, `x`๊ฐ ์ ์๋์ง ์์์ผ๋ฏ๋ก ReferenceError ๋ฐ์
(0, eval)("x + y"); // ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํธ์ถ
}
eval์ ์ ๋ ์ฌ์ฉํ์ง ๋ง ๊ฒ!
eval()์ ์ธ์๋ก ๋ฐ์ ์ฝ๋๋ฅผ caller์ ๊ถํ์ผ๋ก ์ํํ๋ ์ํํ ํจ์์
๋๋ค. ์
์์ ์ธ ์ํฅ์ ๋ฐ์์ ์ ์๋ ๋ฌธ์์ด์ eval()๋ก ์คํํ๋ค๋ฉด, ๋น์ ์ ์นํ์ด์ง๋ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๊ถํ์ผ๋ก ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์์ ์
์์ ์ธ ์ฝ๋๋ฅผ ์ํํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ํ, ์ 3์ ์ฝ๋๊ฐ eval()์ด ํธ์ถ๋ ์์น์ ์ค์ฝํ๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํด ๋น์ทํ ํจ์์ธ Function์ผ๋ก๋ ์คํํ ์ ์๋ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ ์ต์ JS ์์ง์์ ์ฌ๋ฌ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ต์ ํํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ eval()์ JS ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋์๋ค๋ณด๋ค ๋๋ฆฝ๋๋ค.
์ถ๊ฐ๋ก, ์ต์ JavaScript ์ธํฐํ๋ฆฌํฐ๋ JavaScript๋ฅผ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํํฉ๋๋ค. ์ฆ, ๋ณ์๋ช
์ ๊ฐ๋
์ด ์์ ํ ์์ด์ง๋๋ค. ๊ทธ๋ฌ๋ eval์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๊ณ ์ฝ๋์ ํด๋น ๋ณ์๊ฐ ์๋์ง ํ์ธํ๊ณ ๊ฐ์ ๋์
ํ๊ธฐ ์ํด ๊ธธ๊ณ ๋ฌด๊ฑฐ์ด ๋ณ์๋ช
๊ฒ์์ ์ํํด์ผ ํฉ๋๋ค. ๋ํ eval()์ ํตํด ์๋ฃํ ๋ณ๊ฒฝ ๋ฑ ๋ณ์์ ๋ณํ๊ฐ ์ผ์ด๋ ์ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์ด์ ๋์ํ๊ธฐ ์ํด ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์ฌ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋, (๋คํํ) window.Function์ด๋ผ๋ eval๋ณด๋ค ํจ์ฌ ๋์ ๋์์ด ์์ต๋๋ค. eval()์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ Function()์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์๋๋ฅผ ์ฐธ์กฐํ์ธ์.
eval์ ์ฌ์ฉํ๋ ๋์ ์ฝ๋:
function looseJsonParse(obj) {
return eval(obj);
}
console.log(looseJsonParse("{a:(4-1), b:function(){}, c:new Date()}"));
eval์ด ์๋ ์ฝ๋:
function looseJsonParse(obj) {
return Function('"use strict";return (' + obj + ")")();
}
console.log(looseJsonParse("{a:(4-1), b:function(){}, c:new Date()}"));
์์ ๋ ์ฝ๋๋ ์ผํ ๋ณด๋ฉด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, eval์ด ์๋ ์ฝ๋๊ฐ ํจ์ฌ ๋๋ฆฝ๋๋ค. ํ๊ฐ๋๋ ๊ฐ์ฒด์ c: new Date()๋ฅผ ์ฃผ๋ชฉํ์ธ์. eval์ด ์๋ ํจ์์ ๊ฒฝ์ฐ ์ด ๊ฐ์ฒด๋ ์ ์ญ ๋ฒ์์์ ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์๋ Date๋ฅผ ๊ฐ์ ์ด๋ฆ์ ์ง์ญ ๋ณ์๊ฐ ์๋๋ผ window.Date๋ก ์ทจ๊ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ eval()์ ์ฌ์ฉํ๋ ์ฝ๋์์๋ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ Date๋ฅผ ์ด๋ ๊ฒ ์ทจ๊ธํ ์ ์์ต๋๋ค.
function Date(n) {
return [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
][n % 7 || 0];
}
function looseJsonParse(obj) {
return eval(obj);
}
console.log(looseJsonParse("{a:(4-1), b:function(){}, c:new Date()}"));
๊ทธ๋ฌ๋ฏ๋ก eval()์ด ์๋ ์ฝ๋์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ Date()๋ผ๋ ์ง์ญ ๋ณ์์ ์กด์ฌ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ฌด๊ฑฐ์ด ๋ณ์๋ช
ํ์์ ์ํํด์ผ ํ๋ฉฐ, ์ด๋ Function()๊ณผ ๋น๊ตํ๋ฉด ๋งค์ฐ ๋๋ฆฝ๋๋ค.
๋ง์ฝ ์์ ์ํฉ์์ ์ค์ ๋ก ์๋ก ์ ์ธํ Date ํจ์๋ฅผ Function()์์ ์คํํด์ผ ํ๋ ์ํฉ์ ์๊ฐํด ๋ด
์๋ค. ์ด๋ ๊ฒ ๋๋ฉด eval()๋ก ๋์๊ฐ์ผ ํ ๊น์? ๋ฌผ๋ก ์๋๋๋ค. ์๋์ ์ ๊ทผ์ ์๋ํด ๋ณด์ธ์.
function Date(n) {
return [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
][n % 7 || 0];
}
function runCodeWithDateFunction(obj) {
return Function('"use strict";return (' + obj + ")")()(Date);
}
console.log(runCodeWithDateFunction("function(Date){ return Date(5) }"));
์ ์ฝ๋๋ ์ผ์ค ์ค์ฒฉ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋นํจ์จ์ ์ผ๋ก ๋ณด์ผ ์ ์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ์ด์ ์ ์ฐ์ ์ดํด๋ด ์๋ค.
1. runCodeWithDateFunction์ ๋ฌธ์์ด๋ก ์ ๋ฌ๋ ์ฝ๋๋ฅผ ์ต์ํํ ์ ์๋ค.
2. Function call overhead is minimal, making the far smaller code size well worth the benefit
3. Function()์ "use strict";๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
4. eval()์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์คํ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๋ค.
๋ง์ง๋ง์ผ๋ก ์ฝ๋ ์ต์ํ์ ์ธก๋ฉด์์ ์ดํด๋ณด๋ฉด, ์์ ๊ฐ์ด Function()์ ์ฌ์ฉํ์ ๋๋ ์๋์ ์ต์ํ๋ ์ฝ๋์ ๊ฐ์ด ํจ์์ ์ธ์ ์ด๋ฆ ์ญ์ ์งง๊ฒ ์ค์ผ ์ ์์ผ๋ฏ๋ก runCodeWithDateFunction์ ์ ๋ฌํ๋ ์ฝ๋ ๋ฌธ์์ด์ ๋์ฑ ํจ์จ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
console.log(
Function('"use strict";return(function(a){return a(5)})')()(function (a) {
return "Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(
" ",
)[a % 7 || 0];
}),
);
์์ฃผ ์ฐ์ด๋ ์ฉ๋ก์ ๋ํด์๋ eval()์ด๋ Function()๋ณด๋ค ์์ ํ๊ณ ๋น ๋ฅธ ๋์๋ ์กด์ฌํฉ๋๋ค.
๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผํ๊ธฐ
์์ฑ๋ช
์ผ๋ก ์์ฑ์ ์ฐพ๋ ๋ฐ eval()์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ๋ค์ ์์ ์ ๊ฐ์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ๊น์ง๋ ์ ๊ทผํ ์์ฑ์ ์ ์ ์๋ ์ํฉ์ ์๊ฐํด ๋ด
์๋ค. ์ด ์ํฉ์ eval๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
var obj = { a: 20, b: 30 };
var propname = getPropName(); // "a" ๋๋ "b"๋ฅผ ๋ฐํ
eval("var result = obj." + propname);
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์์ eval()์ ์ธ ํ์๊ฐ ์๊ณ , ์ง์๋์ด์ผ ํฉ๋๋ค. ๊ทธ ๋์ ํจ์ฌ ๋น ๋ฅด๊ณ ์์ ํ ์์ฑ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
var obj = { a: 20, b: 30 };
var propname = getPropName(); // "a" ๋๋ "b"๋ฅผ ๋ฐํ
var result = obj[propname]; // obj[ "a" ]๋ obj.a์ ๋์ผํจ
์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ ๊น์ ์์ฑ์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. eval()์ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค.
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // "a.b.c"๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์
eval("var result = obj." + propPath);
์ฌ๊ธฐ์ eval()์ ์ฌ์ฉ์ ํผํ๋ ค๋ฉด ์์ฑ ๊ฒฝ๋ก๋ฅผ splitํ ๋ค์ ์์๋๋ก ์ ๊ทผํ ์๋ ์์ต๋๋ค.
function getDescendantProp(obj, desc) {
var arr = desc.split(".");
while (arr.length) {
obj = obj[arr.shift()];
}
return obj;
}
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // "a.b.c"๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์
var result = getDescendantProp(obj, propPath);
์์ฑ์ ๊ฐ์ ๋์ ํ๋ ๊ฒ๋ ๋น์ทํ๊ฒ ํ ์ ์์ต๋๋ค.
function setDescendantProp(obj, desc, value) {
var arr = desc.split(".");
while (arr.length > 1) {
obj = obj[arr.shift()];
}
return (obj[arr[0]] = value);
}
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // "a.b.c"๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์
var result = setDescendantProp(obj, propPath, 1); // test.a.b.c์ ๊ฐ์ 1๋ก ์ง์ ๋จ
๋จํธ์ ์ธ ์ฝ๋ ์ํ ๋์ ํจ์ ์ฌ์ฉํ๊ธฐ
JavaScript์ ํจ์๋ 1๊ธ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ค๋ฅธ API์ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ ์๋ ์๊ณ , ๋ณ์๋ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๋์ ํ ์๋ ์์ต๋๋ค. ๋ค์์ DOM API๋ ์ด ์ ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋๋ฏ๋ก, ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง์ผ ํฉ๋๋ค.
// setTimeout(" ... ", 1000) ๋์ ์
setTimeout(function() { ... }, 1000);
// elt.setAttribute("onclick", "...") ๋์ ์
elt.addEventListener("click", function() { ... } , false);
๋ํ ํด๋ก์ ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด์ ํฉ์น๋ ๋ฑ์ ์ฐ์ฐ ์์ด ๋งค๊ฐ๋ณ์ํ๋ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
JSON ํ์ฑ (๋ฌธ์์ด์ JavaScript ๊ฐ์ฒด๋ก ๋ณํ)
eval()์ ํธ์ถํ๋ ค๋ ๋ฌธ์์ด์ ์ฝ๋๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด(์๋ฅผ ๋ค์ด "[1, 2, 3]"๊ณผ ๊ฐ์ ๋ฐฐ์ด), ๋์ JavaScript์ ๋ฌธ๋ฒ ์ผ๋ถ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ํํํ ์ ์๋ JSON์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. Downloading JSON and JavaScript in extensions๋ ์ฐธ๊ณ ํด ๋ณด์ธ์.
JSON ๋ฌธ๋ฒ์ JavaScript ๋ฌธ๋ฒ์ ๋นํด ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์, ์ ํจํ JavaScript ๋ฆฌํฐ๋ด์ด JSON์ผ๋ก ๋ณํ๋์ง ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, JSON์์๋ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์ฝค๋ง๋ก ๋๋ผ ์ ์๊ณ , ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ์์ฑ๋ช (ํค)์ ๋ฐ๋์ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค. ๋์ค์ JSON์ผ๋ก ํ์ฑํ ๋ฌธ์์ด์ ์์ฑํ ๋๋ JSON ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
์ฝ๋ ๋์ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ
์๋ฅผ ๋ค์ด, ์น ํ์ด์ง์ ๋ด์ฉ์ ์ถ์ถํ๋ ํ์ฅ ํ๋ก๊ทธ๋จ์ JavaScript ์ฝ๋ ๋์ XPath์ ์คํฌ๋ฉ ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค.
์ ํ๋ ๊ถํ์ผ๋ก ์ฝ๋ ์คํํ๊ธฐ
์ 3์ ์ฝ๋๋ฅผ ์คํํด์ผ ํ ๋๋ ์ ํ๋ ๊ถํ์ผ๋ก ์คํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ํ์ฅ ํ๋ก๊ทธ๋จ์ด๋ XUL ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ๋๋ฉฐ, ์ด๋ Components.utils.evalInSandbox๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์
>eval ์ฌ์ฉํ๊ธฐ
์๋ ์ฝ๋์์ eval()๋ฅผ ํฌํจํ๋ ๋ฌธ์ฅ์ ๋ชจ๋ 42๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์๋ ๋ฌธ์์ด "x + y + 1"์, ํ์๋ ๋ฌธ์์ด "42"๋ฅผ ํ๊ฐํฉ๋๋ค.
var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // 42๋ฅผ ๋ฐํ
eval(z); // 42๋ฅผ ๋ฐํ
eval์ ์ฌ์ฉํด์ JavaScript ์ฝ๋ ๋ฌธ์์ด ํ๊ฐํ๊ธฐ
๋ค์ ์์ ์์๋ eval()์ ์ฌ์ฉํ์ฌ str ๋ฌธ์์ด์ ํ๊ฐํฉ๋๋ค. ์ด ๋ฌธ์์ด์ x๊ฐ 5์ด๋ฉด ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ๋ค์ z์ 42๋ฅผ ํ ๋นํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด z์ 0 ์ ํ ๋นํ๋ JavaScript ์ฝ๋์
๋๋ค. ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ด ์คํ๋๋ฉด, eval()์ ์ด ๋ฌธ์ฅ์ ์งํฉ์ ์ํํ๊ณ , z์ ํ ๋น๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
var x = 5;
var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0; ";
console.log("z is ", eval(str));
์ฌ๋ฌ ๊ฐ์ ์ ์ํ ๊ฒฝ์ฐ ๋ง์ง๋ง ๊ฐ์ ๋ฐํํฉ๋๋ค.
var x = 5;
var str = "if (x == 5) {console.log('z is 42'); z = 42; x = 420; } else z = 0;";
console.log("x is ", eval(str)); // z๋ 42, x๋ 420
๋ง์ง๋ง ํํ์์ด ์ํ๋๋ค
eval() ์ ๋ง์ง๋ง ํํ์์ ํ๊ฐ๊ฐ์ ๋ฐํํฉ๋๋ค.
var str = "if ( a ) { 1+1; } else { 1+2; }";
var a = true;
var b = eval(str); // 2๋ฅผ ๋ฐํ
console.log("b is : " + b);
a = false;
b = eval(str); // 3์ ๋ฐํ
console.log("b is : " + b);
ํจ์ ์ ์ ๋ฌธ์์ด๋ก์์ eval ์ ์๋ค๋ฅผ "("์ ")"๋ก ๊ฐ์ธ์ผ ํ๋ค
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // undefined๋ฅผ ๋ฐํ
var fct2 = eval(fctStr2); // ํจ์๋ฅผ ๋ฐํ