Baseline Widely available
ê²½ê³ : 주ì: 문ìì´ë¡ë¶í°
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
구문 매ê°ë³ì
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); // í¨ì를 ë°í
ë¸ë¼ì°ì í¸íì± ì°¸ê³
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4