This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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

๊ตฌ๋ฌธ

js
eval(string);

๋งค๊ฐœ๋ณ€์ˆ˜

string

JavaScript ํ‘œํ˜„์‹, ๋ช…๋ น๋ฌธ, ๋˜๋Š” ์—ฐ์†๋˜๋Š” ๋‹ค์ˆ˜์˜ ๋ช…๋ น๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด. ํ‘œํ˜„์‹์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋‚˜ ์†์„ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ฃผ์–ด์ง„ ์ฝ”๋“œ๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ์–ป์€ ๊ฐ’. ๊ฐ’์ด ์—†๋‹ค๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…

eval()์€ ์ „์—ญ ๊ฐ์ฒด์˜ ํ•จ์ˆ˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

eval()์˜ ์ธ์ž๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ธ์ž๊ฐ€ ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด eval()์€ ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ JavaScript ๋ช…๋ น๋ฌธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ๋ชจ๋‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์‹์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด eval()์„ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. JavaScript๋Š” ์—ฐ์‚ฐ์‹์„ ์•Œ์•„์„œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด๋กœ ์—ฐ์‚ฐ์‹์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋‚˜์ค‘์— eval()๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. x ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด x๊ฐ€ ํฌํ•จ๋œ ์—ฐ์‚ฐ์‹์„ ๋ฌธ์ž์—ด๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด "3 * x + 2"๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ๋‚˜์ค‘์— eval()์„ ํ˜ธ์ถœํ•ด์„œ ๊ณ„์‚ฐ์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

eval()์˜ ์ธ์ž๊ฐ€ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด eval()์€ ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ, String ์ƒ์„ฑ์ž๊ฐ€ ๋ช…์‹œ๋œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด์„ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  String ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
eval(new String("2 + 2")); // "2 + 2"๋ฅผ ํฌํ•จํ•œ String ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
eval("2 + 2"); // 4๋ฅผ ๋ฐ˜ํ™˜

toString()์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ œ์•ฝ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
var expression = new String("2 + 2");
eval(expression.toString()); // 4๋ฅผ ๋ฐ˜ํ™˜

eval์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ECMAScript 5๋ถ€ํ„ฐ๋Š” ์ง€์—ญ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์—ญ ๋ฒ”์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด eval()๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ „์—ญ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ณ , ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜๋Š” ์œ„์น˜์˜ ์ง€์—ญ ๋ฒ”์œ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

js
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์„ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ ์ฝ”๋“œ:

js
function looseJsonParse(obj) {
  return eval(obj);
}
console.log(looseJsonParse("{a:(4-1), b:function(){}, c:new Date()}"));

eval์ด ์—†๋Š” ์ฝ”๋“œ:

js
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๋ฅผ ์ด๋ ‡๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

js
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()๋กœ ๋Œ์•„๊ฐ€์•ผ ํ• ๊นŒ์š”? ๋ฌผ๋ก  ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ ‘๊ทผ์„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.

js
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์— ์ „๋‹ฌํ•˜๋Š” ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
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๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
var obj = { a: 20, b: 30 };
var propname = getPropName(); // "a" ๋˜๋Š” "b"๋ฅผ ๋ฐ˜ํ™˜

eval("var result = obj." + propname);

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ eval()์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ณ , ์ง€์–‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์‹  ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•œ ์†์„ฑ ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

js
var obj = { a: 20, b: 30 };
var propname = getPropName(); // "a" ๋˜๋Š” "b"๋ฅผ ๋ฐ˜ํ™˜
var result = obj[propname]; //  obj[ "a" ]๋Š” obj.a์™€ ๋™์ผํ•จ

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋” ๊นŠ์€ ์†์„ฑ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. eval()์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // "a.b.c"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •

eval("var result = obj." + propPath);

์—ฌ๊ธฐ์„œ eval()์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ ค๋ฉด ์†์„ฑ ๊ฒฝ๋กœ๋ฅผ splitํ•œ ๋‹ค์Œ ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

js
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);

์†์„ฑ์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ๋„ ๋น„์Šทํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
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๋Š” ์ด ์ ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

js
// 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"๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

js
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์— ํ• ๋‹น๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
var x = 5;
var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0; ";

console.log("z is ", eval(str));

์—ฌ๋Ÿฌ ๊ฐ’์„ ์ •์˜ํ•  ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
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() ์€ ๋งˆ์ง€๋ง‰ ํ‘œํ˜„์‹์˜ ํ‰๊ฐ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
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 ์€ ์•ž๋’ค๋ฅผ "("์™€ ")"๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค

js
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // undefined๋ฅผ ๋ฐ˜ํ™˜
var fct2 = eval(fctStr2); // ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

์ฐธ๊ณ