eval() ãªãã§ JavaScript èšç®æ©ãäœã
JavaScript ã§ã³ãŒããæžããŠãããšãåçã«ã³ãŒããå®è¡ããå¿
èŠãããå Žé¢ãåºãŠããŸããå€ãã®éçºè
ã¯ãã®ãããªæã« eval() 颿°ãæãæµ®ãã¹ãã§ããããeval() ã¯æååãã³ãŒããšããŠèªèãå®è¡ããŠããã䟿å©ãªæ©èœã§ãããããããã®äŸ¿å©ãã®è£ã«ã¯é倧ãªã»ãã¥ãªãã£ãªã¹ã¯ãšããã©ãŒãã³ã¹äœäžã®åé¡ãæœãã§ããŸãã
ãã®èšäºã§ã¯ãeval() ã䜿ãããšããªãå±éºãªã®ããèŠãŠãããããå®å
šã§å¹ççãªä»£æ¿ææ®µã§ãã new Function() ã䜿ã£ãŠåçã«ã³ãŒããå®è¡ããæ¹æ³ã詳ããèŠãŠãããŸãããã®èšäºãéããŠãçããã¯ããå®å
šã§å
ç¢ãªã³ãŒããäœãåãé€ãããšãã§ããã§ãããã
eval() ãšã¯äœã§ããªãå±éºãªã®ã§ããããïŒ
eval() ã¯æž¡ãããæååã JavaScript ã³ãŒããšããŠè§£éããå®è¡ããã°ããŒãã«é¢æ°ã§ããäŸãã°ãeval("2 + 2") ã¯æ°å€ 4 ãè¿ããŸãããã®ããã«ãæååã§è¡šçŸãããã³ãŒããåçã«å®è¡ã§ãããããèšç®æ©ããžãã¯ãªã©ãå®è£
ããéã«ã¯æçšã«èŠããŸãã
ããã eval() ã®äœ¿çšã«ã¯ãããã€ãã®æ·±å»ãªåé¡ãçºçããå¯èœæ§ããããŸãã
eval()ã«ã€ããŠãã£ãšè©³ããèŠãŠãããŸãããïŒ
1. ã»ãã¥ãªãã£è匱æ§
eval() ã®æå€§ã®åé¡ã¯ã»ãã¥ãªãã£ã§ãããã®é¢æ°ã¯åŒã³åºãããã¹ã³ãŒãã®æš©éã§ã³ãŒããå®è¡ããŠããŸãããããããŠãŒã¶ãŒãå
¥åããå€ãæ€èšŒããã« eval() ã§å®è¡ãããšãæªæããã³ãŒãããã®ãŸãŸå®è¡ãããŠããŸããããããããŸãã
äŸãã°ããŠãŒã¶ãŒãå
¥åããå€ã eval() ã§åŠçããã³ãŒãããã£ããšä»®å®ããŸãããã
var userContent = getUserInput(); // ãŠãŒã¶ãŒããå
¥åãåãåã颿°
eval(userContent); // å±éºïŒãŠãŒã¶ãŒãå
¥åããå
容ããã®ãŸãŸã³ãŒããšããŠå®è¡ãããå¯èœæ§ããããŸãã
ãããŠãŒã¶ãŒã "alert('ãããã³ã°ãããŸããïŒ')" ãšãã£ãæååãå
¥åãããããã®ã¹ã¯ãªããããã®ãŸãŸå®è¡ãããŠäºæãã¬åäœãåŒãèµ·ãããŸããããã¯ãŠã§ããµã€ãã®éèŠæ
å ±æŒæŽ©ããµãŒãã¹é害ã«ã€ãªããå¯èœæ§ã®ããé倧ãªã»ãã¥ãªãã£è
åšã§ãã
2. ããã©ãŒãã³ã¹äœäž
eval() 㯠JavaScript ãšã³ãžã³ã®ã³ãŒãæé©åã劚ããŸããææ°ã® JavaScript ãšã³ãžã³ïŒJIT ã³ã³ãã€ã©ãªã©ïŒã¯ãã³ãŒããå®è¡ããåã«è§£æããŠæé©åããããã»ã¹ãçµãŠããŸããããã eval() ã䜿ããããšããšã³ãžã³ã¯ eval() å
ã®ã³ãŒããã©ã®å€æ°ãåç
§ã»ä¿®æ£ããã®ãäºæž¬ã§ããªããªããŸãã
çµæãšããŠããšã³ãžã³ã¯å€æ°åã®åç §ãªã©ãé ãæ¹åŒã§åŠçããããåŸããå Žåã«ãã£ãŠã¯ã³ã³ãã€ã«ãããã³ãŒããåã³è§£éããªããã°ãªããªããããããŸãããããã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹äœäžã«ã€ãªãããŸãã
ããå®å
šãªä»£æ¿ïŒnew Function()
eval() ã®ãªã¹ã¯ãé¿ãã€ã€ã³ãŒããåçã«å®è¡ã§ãããããè¯ãæ¹æ³ããããŸããã€ãŸããnew Function() ã³ã³ã¹ãã©ã¯ã¿ã䜿ãããšã§ãã
new Function() ã¯ãã©ã¡ãŒã¿ãªã¹ããšé¢æ°æ¬äœãæååãšããŠåãåããæ°ãã颿°ãªããžã§ã¯ããçæããŠè¿ããŸãã
new Function() ã®äœ¿ãæ¹
åºæ¬çãªææ³ã¯ä»¥äžã®éãã§ãã
let func = new Function ([arg1, arg2, ...argN], functionBody);
äŸãã°ã2â¯ã€ã®æ°å€ãè¶³ãåããã颿°ã 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() ã JavaScript ãšã³ãžã³ã®æé©åã劚ããäžæ¹ã§ãnew Function() ã¯æ¯èŒçããã©ãŒãã³ã¹ã«æå©ã§ããå¯èœæ§ããããŸããnew Function() ã§çæãããã³ãŒãã¯å¥ã®é¢æ°æ¬äœã®äžã«ååšããããŒã«ã«ã¹ã³ãŒããæ±æããªãããããšã³ãžã³ãã³ãŒããããç°¡åã«è§£æãæé©åã§ããããã§ãã
ãã¡ãããnew Function() ãã©ã³ã¿ã€ã ã«æååãè§£æã»ã³ã³ãã€ã«ããããã»ã¹ãå¿
èŠãšãããããéçã«é¢æ°ã宣èšããããã¯é
ãã§ãããåçã«ã³ãŒããå®è¡ããªããã°ãªããªãç¶æ³ã§ã¯ eval() ããããã£ãšè¯ãéžæè¢ã§ãã
new Function() äœ¿çšæã®ãã¹ããã©ã¯ãã£ã¹
new Function() 㯠eval() ããå®å
šãšã¯ãããäŸç¶ãšããŠãŠãŒã¶ãŒå
¥åãçŽæ¥ã³ãŒãæ¬äœã«äœ¿çšããããšã¯å±éºãšãªãåŸãŸããåçã«ã³ãŒããçæããéã«ã¯ãåžžã«æ¬¡ã®æéãå®ãããšããå§ãããŸãã
-
ãŠãŒã¶ãŒå ¥åãçŽæ¥äœ¿ããªãããšïŒèšç®æ©ããžãã¯ãäœããªãããŠãŒã¶ãŒãå ¥åããå®å šãªæ°åŒããã®ãŸãŸ
new Function()ã«æž¡ããªãã§ãã ããã代ããã«ãå ¥åå€ãè§£æããŠå®å šã確èªãããæŒç®åïŒ+, â, *, /ïŒ ãšæ°åã ããçµã¿åãããŠé¢æ°æ¬äœãçæããŸãããã -
峿 Œã¢ãŒãïŒStrict ModeïŒã䜿çšããïŒ
new Function('"use strict"; ...')ã®ããã«é¢æ°æ¬äœã®éå§éšã«'use strict'ã远å ããŠãããå®å šãªã³ãŒããæžãããã«ããŸãããã峿 Œã¢ãŒãã¯ãããã€ãã®å±éºãªæ§æããšã©ãŒãšããŠåŠçããŠãããŸãã -
代æ¿çããŸãæ€èšããããšïŒåçã«ã³ãŒããçæããå¿ èŠæ§ã«ã€ããŠãããäžåºŠèããŠã¿ãŠãã ãããå€ãã®å Žåãéçãªé¢æ°ãããŒã¿æ§é ïŒäŸïŒãªããžã§ã¯ãããããïŒãçšããŠãåãæ©èœãããå®å šã»å¹ççã«å®è£ ã§ããŸãã
ããè¯ãã³ãŒãã«åããŠ
eval() ã¯åŒ·åã§äŸ¿å©ãªæ©èœã§ããããã®è£ã«ã¯é倧ãªã»ãã¥ãªãã£ããã³ããã©ãŒãã³ã¹ãªã¹ã¯ãååšããŠããŸããããã¥ã¡ã³ãã§ã eval() ãã絶察ã«äœ¿çšãã¹ãã§ã¯ãªãïŒNever use eval!ïŒããšåŒ·ãèŠåããŠããŸãã
幞ãã«ããç§ãã¡ã«ã¯ new Function() ãšãããããå®å
šã§å¹ççãªä»£æ¿ææ®µããããŸããnew Function() ã¯å®è¡ã¹ã³ãŒããã°ããŒãã«ã«éå®ããããšã§ eval() ã®äž»èŠãªã»ãã¥ãªãã£è匱æ§ãè§£æ¶ããã³ãŒãæé©åã«ãæå©ã§ãã
ãã¡ããæè¯ã®æ¹æ³ã¯ãããããåçã«ã³ãŒããçæããç¶æ³ãé¿ããããšã§ãããããã©ãããŠãå¿
èŠãªå Žåã«ã¯ããããã㯠eval() ã®ä»£ããã« new Function() ã䜿ã£ãŠãããå®å
šã§å
ç¢ãªã³ãŒããæžããŠã¿ãŸããããããªãã®ã³ãŒãã¯äžæ®µãšã¬ãã«ã¢ããããã¯ãã§ãã :)