Baseline Widely available
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()
就伿§è¡è¿äºè¯å¥ãä¸éè¦ç¨ eval()
æ¥æ§è¡ä¸ä¸ªç®æ¯è¡¨è¾¾å¼ï¼å 为 JavaScript å¯ä»¥èªå¨ä¸ºç®æ¯è¡¨è¾¾å¼æ±å¼ã
å¦æä½ ä»¥å符串ç形弿é äºç®æ¯è¡¨è¾¾å¼ï¼é£ä¹å¯ä»¥å¨åé¢ç¨ eval()
坹宿±å¼ãä¾å¦ï¼åè®¾ä½ æä¸ä¸ªåé x
ï¼ä½ å¯ä»¥éè¿å°è¡¨è¾¾å¼çå符串å¼ï¼ä¾å¦ 3 * x + 2
ï¼èµå¼ç»ä¸ä¸ªåéï¼ç¶åå¨ä½ ç代ç åé¢çå
¶ä»å°æ¹è°ç¨ eval()
ï¼æ¥æ¨è¿æ¶å x
ç表达å¼çæ±å¼ã
妿 eval()
ç忰䏿¯åç¬¦ä¸²ï¼ eval()
ä¼å°åæ°åå°ä¸å¨å°è¿åãå¨ä¸é¢çä¾åä¸ï¼String
æé å¨è¢«æå®ï¼è eval()
è¿åäº String
对象è䏿¯æ§è¡å符串ã
eval(new String("2 + 2")); // è¿åäºå
å«"2 + 2"çå符串对象
eval("2 + 2"); // returns 4
ä½ å¯ä»¥ä½¿ç¨ä¸äºéç¨çæ¹æ³æ¥ç»è¿è¿ä¸ªéå¶ï¼ä¾å¦ä½¿ç¨ toString()
ã
var expression = new String("2 + 2");
eval(expression.toString());
å¦æä½ é´æ¥çä½¿ç¨ eval()
ï¼æ¯å¦éè¿ä¸ä¸ªå¼ç¨æ¥è°ç¨å®ï¼è䏿¯ç´æ¥çè°ç¨ eval
ãä» ECMAScript 5 èµ·ï¼å®å·¥ä½å¨å
¨å±ä½ç¨åä¸ï¼è䏿¯å±é¨ä½ç¨åä¸ãè¿å°±æå³çï¼ä¾å¦ï¼ä¸é¢ç代ç çä½ç¨å£°æå建ä¸ä¸ªå
¨å±å½æ°ï¼å¹¶ä¸ eval
ä¸çè¿äºä»£ç 卿§è¡æé´ä¸è½å¨è¢«è°ç¨çä½ç¨åä¸è®¿é®å±é¨åéã
function test() {
var x = 2,
y = 4;
console.log(eval("x + y")); // ç´æ¥è°ç¨ï¼ä½¿ç¨æ¬å°ä½ç¨åï¼ç»ææ¯ 6
var geval = eval; // çä»·äºå¨å
¨å±ä½ç¨åè°ç¨
console.log(geval("x + y")); // é´æ¥è°ç¨ï¼ä½¿ç¨å
¨å±ä½ç¨åï¼throws ReferenceError å 为 `x` æªå®ä¹
(0, eval)("x + y"); // å¦ä¸ä¸ªé´æ¥è°ç¨çä¾å
}
æ°¸è¿ä¸è¦ä½¿ç¨ eval
ï¼
eval()
æ¯ä¸ä¸ªå±é©ç彿°ï¼å®ä½¿ç¨ä¸è°ç¨è
ç¸åçæéæ§è¡ä»£ç ãå¦æä½ ç¨ eval()
è¿è¡çå符串代ç è¢«æ¶ææ¹ï¼ä¸æå¥½æç人ï¼ä¿®æ¹ï¼ä½ æç»å¯è½ä¼å¨ä½ çç½é¡µ/æ©å±ç¨åºçæéä¸ï¼å¨ç¨æ·è®¡ç®æºä¸è¿è¡æ¶æä»£ç ãæ´éè¦çæ¯ï¼ç¬¬ä¸æ¹ä»£ç å¯ä»¥çå°æä¸ä¸ª eval()
被è°ç¨æ¶çä½ç¨åï¼è¿ä¹æå¯è½å¯¼è´ä¸äºä¸åæ¹å¼çæ»å»ãç¸ä¼¼ç Function
å°±ä¸å®¹æè¢«æ»å»ã
eval()
é常æ¯å
¶ä»æ¿ä»£æ¹æ³æ´æ
¢ï¼å 为å®å¿
é¡»è°ç¨ JS è§£éå¨ï¼è许å¤å
¶ä»ç»æåå¯è¢«ç°ä»£ JS 弿è¿è¡ä¼åã
æ¤å¤ï¼ç°ä»£ JavaScript è§£éå¨å° JavaScript 转æ¢ä¸ºæºå¨ä»£ç ãè¿æå³çä»»ä½åéå½åçæ¦å¿µé½ä¼è¢«å é¤ãå æ¤ï¼ä»»æä¸ä¸ª eval ç使ç¨é½ä¼å¼ºå¶æµè§å¨è¿è¡åé¿çåéåç§°æ¥æ¾ï¼ä»¥ç¡®å®åé卿ºå¨ä»£ç ä¸çä½ç½®å¹¶è®¾ç½®å
¶å¼ãå¦å¤ï¼æ°å
容å°ä¼éè¿ eval()
å¼è¿ç»åéï¼æ¯å¦æ´æ¹è¯¥åéçç±»åï¼å æ¤ä¼å¼ºå¶æµè§å¨éæ°æ§è¡ææå·²ç»çæçæºå¨ä»£ç 以è¿è¡è¡¥å¿ã使¯ï¼è°¢å¤©è°¢å°ï¼åå¨ä¸ä¸ªé常好ç eval æ¿ä»£æ¹æ³ï¼åªéä½¿ç¨ window.Functionãè¿æä¸ªä¾åæ¹ä¾¿ä½ äºè§£å¦ä½å°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
çè䏿¯ä¸ä¸ªå为 Date
çå±é¨åéãç¶èï¼å¨ä½¿ç¨ eval()
ç代ç ä¸ï¼æµè§å¨ä¸è½å设è¿ä¸ç¹ï¼å ä¸ºå¦æä½ çä»£ç æ¯ä¸é¢è¿ä¸ªï¼
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()
ç¸æ¯ï¼è¿æ¯é叏使çã
å¨ç±»ä¼¼çæ
åµä¸ï¼å¦æä½ ç¡®å®å¸æè½å¤ä» Function()
å
é¨ç代ç è°ç¨ Date
彿°ï¼è¯¥æä¹åï¼ä½ åºè¯¥èº²é¿å¹¶éåå° 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) }"));
ç±äºä¸éåµå¥å½æ°ï¼ä¸é¢ç代ç 似乿çä½ä¸ï¼ä½è®©æä»¬åæä¸ä¸ä¸è¿°æææ¹æ³ç好å¤ï¼
å®ä½¿å¾ä¼ éç»runCodeWithDateFunction
çå符串ä¸çä»£ç æ´å°ï¼
彿°è°ç¨å¼éå¾å°ï¼ä½¿å¾ä»£ç 尺寸å°å¾å¤ï¼å¼å¾è·çï¼
Function()
æ´å®¹æè®©ä½ ç代ç å©ç¨ç¹æ§ä¿®é¥° "use strict"
ï¼
代ç ä¸ä½¿ç¨ 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." + propsName);
使¯ï¼è¿é并䏿¯å¿
é¡»å¾ä½¿ç¨ eval()
ãäºå®ä¸ï¼è¿éå¹¶ä¸å»ºè®®è¿æ ·ä½¿ç¨ãå¯ä»¥ä½¿ç¨ 屿§è®¿é®å¨ è¿è¡ä»£æ¿ï¼å®æ´å¿«ãæ´å®å
¨ï¼
var obj = { a: 20, b: 30 };
var propName = getPropName(); // è¿å "a" æ "b"
var result = obj[propName]; // obj[ "a" ] ä¸ obj.a çä»·
ä½ è¿å¯ä»¥ä½¿ç¨è¿ä¸ªæ¹æ³å»è®¿é®å代ç屿§ãå¦ä¸ï¼
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // ä¾å¦è¿å "a.b.c"
eval("var result = obj." + propPath);
è¿éï¼å¯ä»¥éè¿åå²å±æ§è·¯å¾ã循ç¯éåä¸åç屿§ï¼æ¥é¿å
eval()
ï¼
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); // a.b.c å¼ä¸º 1
使ç¨å½æ°èéä»£ç æ®µ
JavaScript æ¥æ first-class functionsï¼è¿æå³çä½ å¯ä»¥å°å½æ°ç´æ¥ä½ä¸ºåæ°ä¼ éç»å ¶ä»æ¥å£ï¼å°ä»ä»¬ä¿åå¨åé䏿è 对象ç屿§ä¸ï¼ççãå¾å¤ DOM ç API é½ç¨è¿ç§æè·¯è¿è¡è®¾è®¡ï¼ä½ ä¹å¯ä»¥ï¼æè åºè¯¥ï¼è¿æ ·åè®¾è®¡ä½ ç代ç ï¼
// ä»£æ¿ setTimeout(" ... ", 1000) åæ³ï¼
setTimeout(function() { ... }, 1000);
// ä»£æ¿ elt.setAttribute("onclick", "...") åæ³ï¼
elt.addEventListener('click', function() { ... } , false);
éå 乿å©äºåå»ºåæ°å彿°èä¸ç¨è¿æ¥å符串ã
è§£æ JSONï¼å°å符串转å为 JavaScript 对象ï¼å¦æä½ å¨è°ç¨ eval()
ä¼ å
¥çåç¬¦ä¸²åæ°ä¸å
嫿°æ®ï¼å¦ï¼ä¸ä¸ªæ°ç»â[1,2,3]âï¼è䏿¯ä»£ç ï¼ä½ åºè¯¥èèå°å
¶è½¬æ¢ä¸º JSON 对象ï¼è¿å
è®¸ä½ ç¨ JavaScript è¯æ³çåéæ¥è¡¨ç¤ºæ°æ®ã卿©å±ä¸ä¸è½½ JSON å JavaScript
æç¤ºï¼å 为 JSON è¯æ³åéç¸å¯¹äº JavaScript è¯æ³åéæ¯è¾æå±éæ§ï¼å¾å¤å¨ JavaScript ä¸å¯ç¨çç¹æ§å¨ JSON ä¸å°±ä¸èµ·ä½ç¨äºãæ¯å¦ï¼åç¼éå·å¨ JSON ä¸ä¸æ¯æï¼å¹¶ä¸å¯¹è±¡ä¸ç屿§åå¨ JSON ä¸å¿ é¡»ç¨å¼å·æ¬èµ·æ¥ã请å¡å¿ ä½¿ç¨ JSON åºååæ¹æ³æ¥çæç¨åå°è¢«è§£æä¸º JSON çå符串ã
å°½éä¼ éæ°æ®èé代ç ä¾å¦ï¼è®¾è®¡ä¸ºæåç½é¡µå å®¹çæ©å±ï¼å¯è½ä¼å¨ XPath ä¸å®ä¹æåè§åï¼è䏿¯å¨ JavaScript 代ç ä¸ã
以æéæéè¿è¡ä»£ç å¦æä½ å¿ é¡»æ§è¡è¿æ®µä»£ç ï¼åºèè以æ´ä½çæéè¿è¡ãæ¤å»ºè®®ä¸»è¦éç¨äºæ©å±å XUL åºç¨ç¨åºï¼å¯ä»¥ä½¿ç¨ Components.utils.evalInSandbox åå°é使éã
ç¤ºä¾ ä½¿ç¨eval
å¨ä¸é¢ç代ç ä¸ï¼ä¸¤ç§å
å«äº eval()
ç声æé½è¿åäº 42ã第ä¸ç§æ¯å¯¹å符串 "x + y + 1
" æ±å¼ï¼ç¬¬äºç§æ¯å¯¹å符串 "42
" æ±å¼ã
var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // returns 42
eval(z); // returns 42
ä½¿ç¨ eval
æ§è¡ä¸ä¸² JavaScript è¯å¥
ä¸é¢çä¾åä½¿ç¨ eval()
æ¥æ§è¡ str
å符串ãè¿ä¸ªå符串å
å«äºå¦æ x
çäº 5ï¼å°±æå¼ä¸ä¸ª Alert å¯¹è¯æ¡å¹¶å¯¹ z
èµå¼ 42ï¼å¦å就对 z
èµå¼ 0 ç JavaScript è¯å¥ãå½ç¬¬äºä¸ªå£°æè¢«æ§è¡ï¼eval()
å°ä¼ä»¤å符串被æ§è¡ï¼å¹¶æç»è¿åèµå¼ç» z
ç 42ã
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 is 42 x is 420
è¿åå¼
eval
è¿åæåä¸ä¸ªè¡¨è¾¾å¼çå¼ã
var str = "if ( a ) { 1 + 1; } else { 1 + 2; }";
var a = true;
var b = eval(str); // returns 2
console.log("b is : " + b);
a = false;
b = eval(str); // returns 3
console.log("b is : " + b);
eval
ä¸å½æ°ä½ä¸ºå符串被å®ä¹éè¦âï¼âåâï¼âä½ä¸ºåç¼ååç¼
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // è¿å undefined
var fct2 = eval(fctStr2); // è¿åä¸ä¸ªå½æ°
è§è æµè§å¨å
¼å®¹æ§ Firefox ç¸å
³
eval()
æä¸ä¸ªå¯éç第äºä¸ªåæ°ï¼æå®ä¸ä¸ææ§è¡å¯¹è±¡ãè¿ä¸ªåæ°æ¯éæ åçï¼å¹¶ä¸æç¡®å°ä» Firefox 4 ä¸å é¤ã请åé
Firefox bug 531675ã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