Eval is Evil 😈

eval 은 λ‚΄μž₯ν•¨μˆ˜. 인자둜 받은 β€œλ¬Έμžν˜•β€ 을 μ½”λ“œλ‘œμ„œ μ‹€ν–‰ν•  수 μžˆλ‹€.

let result = eval(code);

let code = 'alert("Hello")';
eval(code); // Hello
let value = eval('1+1');
alert(value); // 2
let value = eval('let i = 0; ++i');
alert(value); // 1

탄생 λ°°κ²½

과거에 jsμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯이 λ§Žμ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—, eval을 μ‚¬μš©ν•΄μ•Όμ§€λ§Œ μ²˜λ¦¬ν•  수 μžˆλŠ” 것듀이 λ§Žμ•˜λ‹€. μ§€κΈˆμ—μ„œλŠ” μ‚¬μš©ν•  μ΄μœ κ°€ μ—†λ‹€. λͺ¨λ˜ν•œ 문법과 λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄μ„œ eval을 μ™„μ „νžˆ λŒ€μ²΄ν•  수 μžˆλ‹€.

eval의 μŠ€μ½”ν”„?

eval은 κ²°κ΅­ ν•¨μˆ˜ λ‹Ήμ—°ν•˜κ²Œλ„ μ™ΈλΆ€ λ³€μˆ˜μ— 접근이 κ°€λŠ₯ν•˜λ‹€.

//
let a = 1;

function f() {
  let a = 2;

  eval('alert(a)'); // 2
}

f();
//λ³€μˆ˜κ°’ μˆ˜μ •ν•˜κΈ°
let x = 5;
eval("x = 10");
alert(x); // 10, λ³€κ²½λœ κ°’

(엄격λͺ¨λ“œ ν•œμ • )eval은 λ˜ν•œ 자체 λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ°€μ§€κΈ° λ•Œλ¬Έμ—, eval 내뢀에 값에 μ ‘κ·Όν•  수 μžˆλ‹€.

//'use strict'κ°€ μ μš©λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

eval("let x = 5; function f() {}");

alert(typeof x); // undefined (μ—†λŠ” λ³€μˆ˜)
f() //f 도 읽을 수 μžˆλ‹€.

μ£Όμ˜ν•  점

eval은 μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν–ˆλ‹€. λ˜ν•œ μ™ΈλΆ€μ—μ„œλ„ λ‚΄λΆ€λ‘œ 접근이 κ°€λŠ₯ν•˜λ‹€. 이둜 μΈν•œ μ£Όμ˜μ‚¬ν•­μ΄ μ‘΄μž¬ν•œλ‹€.