eval() ์์ด ์๋ฐ์คํฌ๋ฆฝํธ ๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค ๋ณด๋ฉด ๋์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ด ๋ eval() ํจ์๋ฅผ ๋ ์ฌ๋ฆฌ๊ณค ํฉ๋๋ค. eval()์ ๋ฌธ์์ด์ ์ฝ๋๋ก ์ธ์ํ๊ณ ์คํํด์ฃผ๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฃ . ํ์ง๋ง ์ด ํธ๋ฆฌํจ ๋ค์๋ ์ฌ๊ฐํ ๋ณด์ ์ํ๊ณผ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ์จ์ด ์์ต๋๋ค.
์ด ๊ธ์์๋ eval()์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ํํ์ง ์์๋ณด๊ณ , ๋ ์์ ํ๊ณ ํจ์จ์ ์ธ ๋์์ธ new Function()์ ์ฌ์ฉํด ๋์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธ์ ํตํด ์ฌ๋ฌ๋ถ์ ๋ ์์ ํ๊ณ ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฅ๋ ฅ์ ๊ธฐ๋ฅผ ์ ์์ ๊ฑฐ์์.
eval()์ด๋ ๋ฌด์์ด๊ณ ์ ์ํํ ๊น์?
eval()์ ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ํด์ํ๊ณ ์คํํ๋ ์ ์ญ ํจ์์
๋๋ค. ์๋ฅผ ๋ค์ด, eval("2 + 2")๋ ์ซ์ 4๋ฅผ ๋ฐํํฉ๋๋ค. ์ด์ฒ๋ผ ๋ฌธ์์ด๋ก ํํ๋ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์คํํ ์ ์์ด ๊ณ์ฐ๊ธฐ ๋ก์ง ๋ฑ์ ๊ตฌํํ ๋ ์ ์ฉํด ๋ณด์ผ ์ ์์ต๋๋ค.
ํ์ง๋ง eval()์ ์ฌ์ฉ์ ์ฌ๋ฌ ๊ฐ์ง ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค.
1. ๋ณด์ ์ทจ์ฝ์
eval()์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๋ณด์์
๋๋ค. ์ด ํจ์๋ ํธ์ถ๋ ์ค์ฝํ์ ๊ถํ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ ๊ฒ์ฆ ์์ด eval()๋ก ์คํํ๋ค๋ฉด ์
์์ ์ธ ์ฝ๋๊ฐ ๊ทธ๋๋ก ์คํ๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ eval()๋ก ์ฒ๋ฆฌํ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
var userContent = getUserInput(); // ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๋ฐ๋ ํจ์
eval(userContent); // ์ํ! ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ์ด ๊ทธ๋๋ก ์ฝ๋๋ก ์คํ๋ ์ ์์ต๋๋ค.
๋ง์ฝ ์ฌ์ฉ์๊ฐ "alert('ํดํน๋นํ์ต๋๋ค!')"์ ๊ฐ์ ๋ฌธ์์ด์ ์
๋ ฅํ๋ค๋ฉด, ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๋๋ก ์คํ๋์ด ์์์น ๋ชปํ ๋์์ ์ผ์ผํต๋๋ค. ์ด๋ ์น์ฌ์ดํธ์ ์ค์ ์ ๋ณด ์ ์ถ์ด๋ ์๋น์ค ์ฅ์ ๋ก ์ด์ด์ง ์ ์๋ ์ฌ๊ฐํ ๋ณด์ ์ํ์
๋๋ค.
2. ์ฑ๋ฅ ์ ํ
eval()์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋ ์ต์ ํ๋ฅผ ๋ฐฉํดํฉ๋๋ค. ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(JIT ์ปดํ์ผ๋ฌ ๋ฑ)์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ถ์ํ๊ณ ์ต์ ํํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ํ์ง๋ง eval()์ด ์ฌ์ฉ๋๋ฉด, ์์ง์ eval() ๋ด๋ถ์ ์ฝ๋๊ฐ ์ด๋ค ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์์ ํ ์ง ์์ธกํ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์์ง์ ๋ณ์ ์ด๋ฆ ์กฐํ์ ๊ฐ์ ์์ ์ ๋๋ฆฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๊ณ , ์ ์ฌ์ ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ๋ค์ ํด์ํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ ์ ์ฒด์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง๋๋ค.
๋ ์์ ํ ๋์: new Function()
eval()์ ์ํ์ฑ์ ํผํ๋ฉด์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์คํํ ์ ์๋ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก new Function() ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
new Function()์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก๊ณผ ํจ์ ๋ณธ๋ฌธ์ ๋ฌธ์์ด ํํ๋ก ๋ฐ์ ์๋ก์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค.
new Function() ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
let func = new Function ([arg1, arg2, ...argN], functionBody);
์๋ฅผ ๋ค์ด, ๋ ์ซ์๋ฅผ ๋ํ๋ ํจ์๋ฅผ new Function()์ผ๋ก ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
const add = new Function('a', 'b', 'return a + b');
console.log(add(2, 3)); // ์ถ๋ ฅ: 5
์ด์ฒ๋ผ new Function()์ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด๋ก ์ ์๋ ๋ก์ง์ ๊ฐ์ง ํจ์๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
new Function()์ ์ ๋ ์์ ํ ๊น์?
new Function()๊ณผ eval()์ ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ **์คํ ์ปจํ
์คํธ(Execution Context)**์ ์์ต๋๋ค.
1. ์คํ ์ปจํ ์คํธ์ ์ฐจ์ด
eval(): ํ์ฌ ์คํ ์ค์ธ **๋ก์ปฌ ์ค์ฝํ(Local Scope)**์์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ์ฆ,eval()์ด ํธ์ถ๋ ํจ์ ๋ด์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.new Function(): ํญ์ **์ ์ญ ์ค์ฝํ(Global Scope)**์์ ์คํ๋๋ ํจ์๋ฅผ ์์ฑํฉ๋๋ค.new Function()์ผ๋ก ๋ง๋ค์ด์ง ํจ์๋ ์์ ์ด ์์ฑ๋ ์์ ์ ๋ก์ปฌ ์ค์ฝํ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
2. ๋ฒ์ ์ ํ์ผ๋ก ์ธํ ๋ณด์ ๊ฐํ
new Function()์ผ๋ก ์์ฑ๋ ํจ์๋ ํด๋ก์ (closure)๋ฅผ ํ์ฑํ์ง ์์ผ๋ฉฐ, ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ(Lexical Environment)์ ์ฐธ์กฐํ์ง ์์ต๋๋ค. ์ค์ง ์ ์ญ ์ค์ฝํ๋ง ์ฐธ์กฐํ ์ ์์ฃ .
๋ค์ ์์ ๋ฅผ ํตํด ์ฐจ์ด์ ์ ๋ช ํํ ํ์ธํด ๋ด ์๋ค.
function demo() {
let localVariable = '์ ๋ ์ง์ญ ๋ณ์์
๋๋ค.';
// eval()์ ๋ก์ปฌ ์ค์ฝํ์ ์ ๊ทผ ๊ฐ๋ฅ
eval("console.log(localVariable);"); // ์ถ๋ ฅ: "์ ๋ ์ง์ญ ๋ณ์์
๋๋ค."
// new Function()์ ๋ก์ปฌ ์ค์ฝํ์ ์ ๊ทผ ๋ถ๊ฐ
try {
const myFunction = new Function("console.log(localVariable);");
myFunction();
} catch (e) {
console.error(e); // ์ถ๋ ฅ: ReferenceError: localVariable is not defined
}
}
demo();
์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด, eval()์ demo ํจ์์ ์ง์ญ ๋ณ์์ธ localVariable์ ์ ๊ทผํ ์ ์์ง๋ง, new Function()์ผ๋ก ์์ฑ๋ ํจ์๋ ์ ๊ทผํ ์ ์์ด ReferenceError๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ฒ๋ผ new Function()์ ์ธ๋ถ ๋ณ์์ ๋ํ ์ ๊ทผ์ ์์ฒ์ ์ผ๋ก ์ฐจ๋จํ๋ฏ๋ก, ์
์ฑ ์ฝ๋๊ฐ ์ง์ญ ๋ณ์๋ฅผ ํตํด ์์คํ
์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
3. ์ฑ๋ฅ์ ์ด์
eval()์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ต์ ํ๋ฅผ ๋ฐฉํดํ๋ ๋ฐ๋ฉด, new Function()์ ์๋์ ์ผ๋ก ์ฑ๋ฅ์ ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค. new Function()์ผ๋ก ์์ฑ๋ ์ฝ๋๋ ๋ณ๋์ ํจ์ ๋ชธ์ฒด ์์ ์กด์ฌํ๋ฉฐ, ๋ก์ปฌ ์ค์ฝํ๋ฅผ ์ค์ผ์ํค์ง ์๊ธฐ ๋๋ฌธ์ ์์ง์ด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ถ์ํ๊ณ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฌผ๋ก , new Function() ์ญ์ ๋ฐํ์์ ๋ฌธ์์ด์ ํ์ฑํ๊ณ ์ปดํ์ผํ๋ ๊ณผ์ ์ด ํ์ํ๋ฏ๋ก, ์ ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ๋ณด๋ค๋ ๋๋ฆฝ๋๋ค. ํ์ง๋ง ๋์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ ์ํฉ์์๋ eval()๋ณด๋ค ํจ์ฌ ๋์ ์ ํ์
๋๋ค.
new Function() ์ฌ์ฉ ์ ๋ชจ๋ฒ ์ฌ๋ก
new Function()์ด eval()๋ณด๋ค ์์ ํ์ง๋ง, ์ฌ์ ํ ์ฌ์ฉ์์ ์
๋ ฅ์ ์ง์ ์ฝ๋ ๋ณธ๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ํํ ์ ์์ต๋๋ค. ๋์ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ํญ์ ๋ค์ ์ง์นจ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ฌ์ฉ์ ์
๋ ฅ์ ์ง์ ์ฌ์ฉํ์ง ๋ง์ธ์: ๊ณ์ฐ๊ธฐ ๋ก์ง์ ๋ง๋ ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ ์ฒด ์์์ ๊ทธ๋๋ก
new Function()์ ๋๊ธฐ์ง ๋ง์ธ์. ๋์ , ์ ๋ ฅ๊ฐ์ ํ์ฑํ๊ณ ์์ ์ฑ์ด ๊ฒ์ฆ๋ ์ฐ์ฐ์(+, -, *, /)์ ์ซ์๋ง ์กฐํฉํ์ฌ ํจ์ ๋ณธ๋ฌธ์ ์์ฑํด์ผ ํฉ๋๋ค. - ์๊ฒฉ ๋ชจ๋(Strict Mode) ์ฌ์ฉ:
new Function('"use strict"; ...')์ ๊ฐ์ด ํจ์ ๋ณธ๋ฌธ ์์ ๋ถ๋ถ์'use strict'๋ฅผ ์ถ๊ฐํ์ฌ ๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ์ธ์. ์๊ฒฉ ๋ชจ๋๋ ์ผ๋ถ ์ํํ ๋ฌธ๋ฒ์ ์๋ฌ๋ก ์ฒ๋ฆฌํด ์ค๋๋ค. - ๋์์ ๋จผ์ ๊ณ ๋ คํ์ธ์: ๋์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ ์ด์ ์ ๋ํด ๋ค์ ํ๋ฒ ์๊ฐํด ๋ณด์ธ์. ๋ง์ ๊ฒฝ์ฐ, ์ ์ ์ธ ํจ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ(์: ๊ฐ์ฒด๋ ๋งต)๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ๋ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋ ๋์ ์ฝ๋๋ฅผ ํฅํ์ฌ
eval()์ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ทธ ์ด๋ฉด์๋ ์ฌ๊ฐํ ๋ณด์ ๋ฐ ์ฑ๋ฅ ๋ฆฌ์คํฌ๊ฐ ์กด์ฌํฉ๋๋ค. MDN ์น ๋ฌธ์์์๋ eval()์ "์ ๋ ์ฌ์ฉํ์ง ๋ง ๊ฒ!(Never use eval!)"์ด๋ผ๊ณ ๊ฐ๋ ฅํ๊ฒ ๊ฒฝ๊ณ ํ๊ณ ์์ต๋๋ค.
๋คํํ ์ฐ๋ฆฌ์๊ฒ๋ new Function()์ด๋ผ๋ ๋ ์์ ํ๊ณ ํจ์จ์ ์ธ ๋์์ด ์์ต๋๋ค. new Function()์ ์คํ ์ค์ฝํ๋ฅผ ์ ์ญ์ผ๋ก ์ ํํ์ฌ eval()์ ์ฃผ์ ๋ณด์ ์ทจ์ฝ์ ์ ํด๊ฒฐํ๊ณ , ์ฝ๋ ์ต์ ํ์๋ ์ ๋ฆฌํฉ๋๋ค.
๋ฌผ๋ก ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ์ํฉ ์์ฒด๋ฅผ ํผํ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ๊ผญ ํ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ด์ ๋ถํฐ๋ eval() ๋์ new Function()์ ์ฌ์ฉํ์ฌ ๋ ์์ ํ๊ณ ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ ํ์ธต ๋ ๋์ ์์ค์ผ๋ก ๋ฐ์ ํ ๊ฒ์
๋๋ค. :)